<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-Hans" lang="zh-Hans">
<head>
<script id="versionArea" type="text/javascript">
//<![CDATA[
var version = {title: "TiddlyWiki", major: 2, minor: 5, revision: 0, date: new Date("Mar 9, 2009"), extensions: {}};
//]]>
</script>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="copyright" content="
TiddlyWiki created by Jeremy Ruston, (jeremy [at] osmosoft [dot] com)

Copyright (c) UnaMesa Association 2004-2009

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of the UnaMesa Association nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
" />
<script id="jsheadArea" type="text/javascript">
//<![CDATA[
/*
 * jQuery JavaScript Library v1.3.2
 * http://jquery.com/
 *
 * Copyright (c) 2009 John Resig
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
 * Revision: 6246
 */
(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
/*
 * Sizzle CSS Selector Engine - v0.9.3
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
//]]>
</script>
<!--PRE-HEAD-START-->
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
<!--PRE-HEAD-END-->
<title> 另辟蹊径 - 拿来做博客 </title>
<style id="styleArea" type="text/css">
#saveTest {display:none;}
#messageArea {display:none;}
#copyright {display:none;}
#storeArea {display:none;}
#storeArea div {padding:0.5em; margin:1em 0em 0em 0em; border-color:#fff #666 #444 #ddd; border-style:solid; border-width:2px; overflow:auto;}
#shadowArea {display:none;}
#javascriptWarning {width:100%; text-align:center; font-weight:bold; background-color:#dd1100; color:#fff; padding:1em 0em;}
</style>
<!--POST-HEAD-START-->

<!--POST-HEAD-END-->
</head>
<body onload="main();" onunload="if(window.checkUnsavedChanges) checkUnsavedChanges(); if(window.scrubNodes) scrubNodes(document.body);">
<!--PRE-BODY-START-->

<!--PRE-BODY-END-->
<div id="copyright">
Welcome to TiddlyWiki created by Jeremy Ruston, Copyright &copy; 2007 UnaMesa Association
</div>
<noscript>
<div id="javascriptWarning">
This page requires JavaScript to function properly.<br /><br />If you are using Microsoft Internet Explorer you may need to click on the yellow bar above and select 'Allow Blocked Content'. You must then click 'Yes' on the following security warning.
</div>
</noscript>
<div id="saveTest"></div>
<div id="backstageCloak"></div>
<div id="backstageButton"></div>
<div id="backstageArea"><div id="backstageToolbar"></div></div>
<div id="backstage">
	<div id="backstagePanel"></div>
</div>
<div id="contentWrapper"></div>
<div id="contentStash"></div>
<div id="shadowArea">
<div title="MarkupPreHead">
<pre>&lt;!--{{{--&gt;
&lt;link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' /&gt;
&lt;!--}}}--&gt;</pre>
</div>
<div title="ColorPalette">
<pre>Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88</pre>
</div>
<div title="StyleSheetColors">
<pre>/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/</pre>
</div>
<div title="StyleSheetLayout">
<pre>/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/</pre>
</div>
<div title="StyleSheetLocale">
<pre>/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/</pre>
</div>
<div title="StyleSheetPrint">
<pre>/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/</pre>
</div>
<div title="PageTemplate">
<pre>&lt;!--{{{--&gt;
&lt;div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'&gt;
&lt;div class='headerShadow'&gt;
&lt;span class='siteTitle' refresh='content' tiddler='SiteTitle'&gt;&lt;/span&gt;&amp;nbsp;
&lt;span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class='headerForeground'&gt;
&lt;span class='siteTitle' refresh='content' tiddler='SiteTitle'&gt;&lt;/span&gt;&amp;nbsp;
&lt;span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id='mainMenu' refresh='content' tiddler='MainMenu'&gt;&lt;/div&gt;
&lt;div id='sidebar'&gt;
&lt;div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'&gt;&lt;/div&gt;
&lt;div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id='displayArea'&gt;
&lt;div id='messageArea'&gt;&lt;/div&gt;
&lt;div id='tiddlerDisplay'&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;!--}}}--&gt;</pre>
</div>
<div title="ViewTemplate">
<pre>&lt;!--{{{--&gt;
&lt;div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'&gt;&lt;/div&gt;
&lt;div class='title' macro='view title'&gt;&lt;/div&gt;
&lt;div class='subtitle'&gt;&lt;span macro='view modifier link'&gt;&lt;/span&gt;, &lt;span macro='view modified date'&gt;&lt;/span&gt; (&lt;span macro='message views.wikified.createdPrompt'&gt;&lt;/span&gt; &lt;span macro='view created date'&gt;&lt;/span&gt;)&lt;/div&gt;
&lt;div class='tagging' macro='tagging'&gt;&lt;/div&gt;
&lt;div class='tagged' macro='tags'&gt;&lt;/div&gt;
&lt;div class='viewer' macro='view text wikified'&gt;&lt;/div&gt;
&lt;div class='tagClear'&gt;&lt;/div&gt;
&lt;!--}}}--&gt;</pre>
</div>
<div title="EditTemplate">
<pre>&lt;!--{{{--&gt;
&lt;div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'&gt;&lt;/div&gt;
&lt;div class='title' macro='view title'&gt;&lt;/div&gt;
&lt;div class='editor' macro='edit title'&gt;&lt;/div&gt;
&lt;div macro='annotations'&gt;&lt;/div&gt;
&lt;div class='editor' macro='edit text'&gt;&lt;/div&gt;
&lt;div class='editor' macro='edit tags'&gt;&lt;/div&gt;&lt;div class='editorFooter'&gt;&lt;span macro='message views.editor.tagPrompt'&gt;&lt;/span&gt;&lt;span macro='tagChooser excludeLists'&gt;&lt;/span&gt;&lt;/div&gt;
&lt;!--}}}--&gt;</pre>
</div>
<div title="GettingStarted">
<pre>To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle &amp; SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: &lt;&lt;option txtUserName&gt;&gt;</pre>
</div>
<div title="OptionsPanel">
<pre>These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

&lt;&lt;option txtUserName&gt;&gt;
&lt;&lt;option chkSaveBackups&gt;&gt; SaveBackups
&lt;&lt;option chkAutoSave&gt;&gt; AutoSave
&lt;&lt;option chkRegExpSearch&gt;&gt; RegExpSearch
&lt;&lt;option chkCaseSensitiveSearch&gt;&gt; CaseSensitiveSearch
&lt;&lt;option chkAnimate&gt;&gt; EnableAnimations

----
Also see [[AdvancedOptions]]</pre>
</div>
<div title="ImportTiddlers">
<pre>&lt;&lt;importTiddlers&gt;&gt;</pre>
</div>
</div>
<!--POST-SHADOWAREA-->
<div id="storeArea">
<div title="(default) 位于 http://ste.tiddlyspot.com/" modifier="（系统）" created="200912031515" tags="systemServer" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200912031515">
<pre>|''Type:''|file|
|''网址：''|http://ste.tiddlyspot.com/|
|''工作区：''|(default)|

此文为自动产生纪录服务器之相关资讯。</pre>
</div>
<div title="10 十一月 2009" modifier="Steve" created="200911100408" tags="日志" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100408">
<pre>早上来图书馆，是走过来的，因为丰年好大雪，而且还冬雷震震。

积雪大概有20cm，宿舍到图书馆大概2km。

不过我来了之后尽写些杂七杂八的东西，本来要写词条的。

不知道为什么日期格式变了，看着好不爽，算了，反正也不怎么写，其实也不该写。</pre>
</div>
<div title="12 十一月 2009" modifier="Steve" created="200911120805" tags="日志" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911120805">
<pre>刚才写了点东西，在我熟悉的领域，打字完全跟不上大脑的思考速度，在约两个小时的时间里，我完成两篇文章共计约4000字的写作。

然而写民法词条就完全不一样了，可能一个字都挤不出来，看一下午之后也许能写上几句。向我写的第一个词条[[无权代理]]，花了三天时间，还有很多事摘录的。

当然两者的作用是不一样的。前者是已有知识的整合和发展，后者是新知识的吸收和积累。两者都不能缺少，所谓学而不思则罔，思而不学则殆。

而且写词条帮助的确蛮大，自己写完之后，感觉就和写书的作者平起平坐了，看书的姿态完全不一样了，那时审视的目光，灰常牛逼！</pre>
</div>
<div title="2009年11月07日" modifier="Steve" created="200911071551" modified="200911071600" tags="日志" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911071600">
<pre>又一次尝试TiddlyWiki，是因为需要一个[[Wiki]]工具，之前尝试了一些，感觉都不好，如今又回归。</pre>
</div>
<div title="2009年12月03日" modifier="Steve" created="200912031437" tags="日志" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200912031437">
<pre>今天好累，但看得其实很少。
明天生日，还是要马不停蹄。</pre>
</div>
<div title="4 December 2009" modifier="Steve" created="200912031621" modified="200912031651" tags="journal" changecount="2">
<pre>今天注册了tiddlyspot的账号，是我所有域名里面最短的，简单庆祝一下。
这个博客很牛逼，只是tag功能还要加强一下。</pre>
</div>
<div title="7 December 2009" modifier="Steve" created="200912070818" tags="journal" changecount="1">
<pre>现在这样长得还不错，比较像博客了，只是没有反馈体系。
以前用Google Site的时候，用Google表单，现在连那个也用不了了。</pre>
</div>
<div title="8 十一月 2009" modifier="Steve" created="200911072044" modified="200911080741" tags="测试" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911080741">
<pre>搞到凌晨@@color(#ff0000):4点40分@@，终于搞定了WikiBar，本来想用WikiEdit的，但是那个始终不能支持中文。
有了这个之后，终于可以安安心心的写我的[[Wiki]]了，但是已经没有时间了。
赶在睡觉之前，完成[[意思表示]]这个词条。

早上完全没有起来，下午带电脑来六教，赶紧接着写词条。
用Dropbox同步到public以后，完全可以当Blog用，请[[猛击这里|https://dl.dropbox.com/u/762096/MyWiki.html]]

&lt;html&gt;
&lt;DIV&gt;&lt;FONT face=微软雅黑 color=#27433B size=3&gt;正文内容&amp;nbsp;&lt;/FONT&gt;&lt;FONT face=微软雅黑&gt;
&lt;/html&gt;
</pre>
</div>
<div title="ArchivedTimeline" modifier="Steve" created="200803211424" modified="200912031729" tags="systemConfig" changecount="2">
<pre>/***
!Metadata:
|''Name:''|ArchivedTimeline|
|''Description:''|Timeline archived monthly.|
|''Version:''|0.7.0|
|''Date:''|Aug 25, 2007|
|''Source:''|http://sourceforge.net/project/showfiles.php?group_id=150646|
|''Author:''|BramChen (bram.chen (at) gmail (dot) com)|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.0.11|
|''Browser:''|Firefox 1.5+; InternetExplorer 6.0|

!Syntax:
{{{&lt;&lt;timeline [modified|created [maxentries [dateFormate]]]&gt;&gt;}}}
!Examples:
{{{&lt;&lt;timeline&gt;&gt;}}}
{{{&lt;&lt;timeline created 10&gt;&gt;}}}
{{{&lt;&lt;timeline modified 10 &quot;MMM DD, YYYY&quot;&gt;&gt;}}}

!Revision History:
|''Version''|''Date''|''Note''|
|0.7.0|Jul 25, 2006|Accept a date format parameter|
|0.6.3|Jan 14, 2007|Cleaned codes, Removed config.macros.timeline.slider and config.macros.timeline.onClickSlider|
|0.6.2|Dec 10, 2006|Add monthFormat to display month format for Chinese|
|0.6.1|Aug 12, 2006|A great effect on config.macros.timeline.slider for Firefox, thanks Bob McElrath|
|0.6.0|Jul 25, 2006|Runs compatibly with TW 2.1.0 (rev #403+)|
|0.5.2|Jun 21, 2006|Fixed bugs for dateFormat of TW 2.1|
|~|~|Change default dateFormat to &quot;0DD MMM, YYYY&quot;|
|0.5.1|Jun 04, 2006|Added config.macros.archivedTimeline.orderBy for localization|
|0.5.0|Apr 19, 2006|Fixed bug for twice records of the same date ()|
|~|~|Added Date.prototype.convertToLocalYYYYMMDDHHMM&lt;&lt;br&gt;&gt;in order to backward compatible with 2.0.6-|
|0.4.0|Apr 03, 2006|Added new parameter, {{{&lt;&lt;timeline [sortfield] [maxentries]&gt;&gt;}}}|
|~|~|Added config.options.txtTimelineMaxentries|
|0.3.1|Feb 04, 2006|JSLint checked|
|0.3.0|Feb 04, 2006|Fixed several missing variable declarations|
|0.2.0|Dec 26, 2005|changed for the new feature of Macro timeline of TW 2.0.0 beta 6|
|0.1.0|Nov 3, 2005|Initial release|

!Code section:
***/
//{{{
version.extensions.archivedTimeline = {major: 0, minor: 7, revision: 0,
	date: new Date(&quot;Aug 26, 2007&quot;),
	name: &quot;ArchivedTimeline&quot;,
	type: &quot;Macro&quot;,
	author: &quot;BramChen&quot;,
	source: &quot;http://sourceforge.net/project/showfiles.php?group_id=150646&quot;
};
config.options.txtTimelineMaxentries=0;
config.macros.archivedTimeline = {
	tooltips: &quot;Archives sorted by  &quot;,
	orderBy:{modified: &quot;modified&quot;, created: &quot;created&quot;},
	monthFormat: &quot;0DD MMM YYYY&quot;,
	dateFormat: &quot;0DD MMM YYYY&quot;
};
config.macros.timeline = config.macros.archivedTimeline;

config.macros.timeline.handler = function(place,macroName,params) {
	var field = params[0] ? params[0] : &quot;modified&quot;;

	place.appendChild(document.createTextNode(this.tooltips + this.orderBy[field]));
	var tiddlers = store.reverseLookup(&quot;tags&quot;,&quot;excludeLists&quot;,false,field);
	var lastMonth = &quot;&quot;; var lastDay = &quot;&quot;; var theText = &quot;----\n&quot;; var i = 0;
	var last = (params[1])?params[1]:config.options.txtTimelineMaxentries;
		last = (isNaN(last)||last&lt;1) ? 0:tiddlers.length-Math.min(tiddlers.length,parseInt(last));
	var dateFormat = params[2] ? params[2] : this.dateFormat;
	var cookie; var archives;
	for (var t=tiddlers.length-1; t&gt;=last; t--) {
		var tiddler = tiddlers[t];
		var theMonth = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,6);
		var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
		if(theMonth != lastMonth) {
			if (lastMonth === &quot;&quot;) {
				lastMonth = theMonth;
				}
			else {
				place.appendChild(document.createElement('hr'));
				cookie = 'chktimeline'+(i++);
				archives = this.formatString(this.monthFormat, lastMonth);
				var panel = config.macros.slider.createSlider(place,cookie,archives,this.tooltips + archives);
				wikify(theText,panel);
				lastMonth = theMonth; theText = '----\n';
			}
		}
		if(theDay != lastDay){
			theText +=  tiddler[field].formatString(dateFormat) + '\n';
			lastDay = theDay; 
		}
		theText += '* [[' + tiddler.title + ']]\n';
	}
	place.appendChild(document.createElement('hr'));
	cookie = 'chktimeline'+(i++);
	archives = this.formatString(this.monthFormat, lastMonth);
	var panel = config.macros.slider.createSlider(place,cookie,archives,this.tooltips + archives);
	wikify(theText,panel);
	place.appendChild(document.createElement('hr'));
};

config.macros.timeline.formatString = function(template, yyyymm)
{
	var dateString = new Date(yyyymm.substr(0,4)+'/'+yyyymm.substr(4,2)+'/01');
	template = template.replace(/DDD|0DD|DD/g,'');
	return dateString.formatString(template);
};
if (!Date.prototype.convertToLocalYYYYMMDDHHMM){
	Date.prototype.convertToLocalYYYYMMDDHHMM = function(){
		return(String.zeroPad(this.getFullYear(),4) + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2));
	}
}
//}}}
</pre>
</div>
<div title="DefaultTiddlers" modifier="Steve" created="200911250913" modified="200911280822" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200911280822">
<pre>关于自己</pre>
</div>
<div title="GTD" modifier="Steve" created="200911080537" modified="200911080604" tags="GTD 首页" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911080604">
<pre>&lt;html&gt;
&lt;br&gt;
&lt;DIV&gt;&lt;FONT face=微软雅黑&gt;&lt;FONT size=6&gt;&lt;STRONG&gt;GTD学习的归纳和整理。&lt;FONT face=微软雅黑&gt;
&lt;/html&gt;
</pre>
</div>
<div title="GTD工具" modifier="Steve" created="200911100238" modified="200911100239" tags="GTD" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100239">
<pre>        1.八个概念工具

主要指的是在GTD流程中的“流程终端”（或者“流程外围”）。用“终端”，或“外围”这个词，是因为我们可以在流程图的“终端”/“外围”看到“它们”。它们至少包括：

         “inbox” ,“trash”，“someday/maybe”,&quot;references&quot; ,&quot;projects&quot;,&quot;next-actions&quot;,&quot;waiting for&quot;,&quot;calendar&quot;这样八个东西。

这八个概念工具，他们不是某种特定的实物工具，但它们每个概念一定对应了具体的载体。换句话说，不管你事实上用了什么东西做你的GTD管理载体，它们的功能都逃不出这八个概念工具。这里有个小tip就是，如果要看你的GTD系统是否构筑完备，至少要看你的意识中和现实生活中你的八个概念工具是否具备（不管是何种形式）。

         2.你的“个性化GTD”

         GTD是一个比较完备的时间管理系统。但它对个人的意义而言，更多是一种思路，而不是实际的万用药。所以，要实现实现你的GTD，不仅仅限于要了解GTD系统，也不仅仅限于去学习某种流行的工具。实现GTD的，就必须在不断探索和实践中打造属于自己的”个性化GTD“系统。</pre>
</div>
<div title="GTD教材" modifier="Steve" created="200911100245" tags="GTD" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100245">
<pre>Get Things Done
小强升职记
各类GTD博客</pre>
</div>
<div title="GTD方法" modifier="Steve" created="200911100236" modified="200911100240" tags="GTD" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100240">
<pre>         从“把想法赶出大脑，释放大脑压力”起，Get Things Done的第一步开始了。GTD至少应该是从行为学、心理学以及管理学的角度来研究和提炼了我们处理事务的线索，得出一个比较完备的时间管理系统。要理解这个系统，自然就从“五大流程”开始。

         五大流程是： 

         Cleaning, （旧：Collect）

         Clarifying,（旧：Process）

         Organizing,（旧：Organize）

         Reflection,（旧：Review）

         Engaging,（旧：Do）</pre>
</div>
<div title="GTD概念" modifier="Steve" created="200911100235" modified="200911100235" tags="GTD" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100235">
<pre>GTD是一种力求统筹内外往来，涵盖丰富时间管理工具（及技巧）的无压生活系统。 

         内+外：GTD关注个体需要处理的各种“信息”既关注源于个体内在需求而产生的时间管理行为（我希望，我想做，我要做...），也关注来自外在环境对个体的事务/职责/角色要求（社会角色，工作任务，生活事件...）

         往+来 ：指（过去，）现在，将来。GTD既关注“下一步”行动的具体执行，也关注对“人生目标”的把握。

         统筹：通过“六个高度” ，GTD达成了对“内外往来”的统筹。

         六个高度是：

         Life,你的人生

         Vision/Strategy,梦想，人生策略

         Goals/Direction,目标/方向

         Responsibility/Focus,职责/关注领域

        Projects,Actions，当下的项目/行动</pre>
</div>
<div title="Google Analytics" modifier="Steve" created="200912031626" modified="200912031630" tags="建站" changecount="2">
<pre>&lt;!--{{{--&gt;
	&lt;!--Site Analytics --&gt;
		&lt;div id=&quot;SiteCounter&quot; style=&quot;display: none&quot; &gt;
	&lt;!--WEBBOT bot=&quot;HTMLMarkup&quot; startspan ALT=&quot;Site Meter&quot; --&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
var gaJsHost = ((&quot;https:&quot; == document.location.protocol) ? &quot;https://ssl.&quot; : &quot;http://www.&quot;);
document.write(unescape(&quot;%3Cscript src='&quot; + gaJsHost + &quot;google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E&quot;));
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
try {
var pageTracker = _gat._getTracker(&quot;UA-8438328-6&quot;);
pageTracker._trackPageview();
} catch(err) {}&lt;/script&gt;
		&lt;/div&gt;
	&lt;!--End of Site Analytics --&gt;
&lt;!--}}}--&gt;</pre>
</div>
<div title="LoadRemoteFileThroughProxy" modifier="YourName" created="200703202229" modified="200912031454" tags="systemConfig">
<pre>/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist &quot;/proxy/&quot; is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date(&quot;mar 17, 2007&quot;), 
 source: &quot;http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy&quot;};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == &quot;http&quot;) &amp;&amp; (url.substr(0,4) == &quot;http&quot;)){ 
 url = store.getTiddlerText(&quot;SiteProxy&quot;, &quot;/proxy/&quot;) + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
</pre>
</div>
<div title="MainMenu" modifier="Steve" created="200911251022" modified="200912070808" tags="建站" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200911280822" changecount="11">
<pre>[[使用说明|GettingStarted]]
[[关于自己]]
[[编辑格式]]
[[民法]]
[[GTD]]
[[软件]]
[[阅读]]
版本：&lt;&lt;version&gt;&gt;

&lt;&lt;tagCloud&gt;&gt;</pre>
</div>
<div title="PageTemplate" modifier="TiddlyThemes" created="200701130013" modified="200708091512" tags="ClassicTheme">
<pre>&lt;div class='header'&gt;
&lt;div class='titleLine'&gt;
&lt;span class='siteTitle' refresh='content' tiddler='SiteTitle'&gt;&lt;/span&gt;&amp;nbsp;
&lt;span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id='mainMenu' refresh='content' tiddler='MainMenu'&gt;&lt;/div&gt;
&lt;div id='sidebar'&gt;
&lt;div macro='gradient vert #ffffff #cc9900'&gt;&lt;a&gt; &lt;/a&gt;&lt;div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id='displayArea'&gt;
&lt;div id='messageArea'&gt;&lt;/div&gt;
&lt;div id='tiddlerDisplay'&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
</div>
<div title="PasswordOptionsPlugin" modifier="YourName" created="200704220851" modified="200912031454" tags="systemConfig">
<pre>/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date(&quot;Apr 19, 2007&quot;),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = &quot;Save this password on this computer&quot;;
config.macros.option.passwordInputType = &quot;password&quot;; // password | text
setStylesheet(&quot;.pasOptionInput {width: 11em;}\n&quot;,&quot;passwordInputTypeStyle&quot;);

merge(config.macros.option.types, {
	'pas': {
		elementType: &quot;input&quot;,
		valueField: &quot;value&quot;,
		eventName: &quot;onkeyup&quot;,
		className: &quot;pasOptionInput&quot;,
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password &quot;save this password on this computer&quot;
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? &quot;true&quot; : &quot;false&quot;;
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options[&quot;chk&quot;+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return &quot;&quot;;
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: &quot;Test password&quot;
	});
*/
//}}}</pre>
</div>
<div title="SiteSubtitle" modifier="Steve" created="200911250906" modified="200911250909" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200911250909">
<pre>拿来做博客</pre>
</div>
<div title="SiteTitle" modifier="Steve" created="200911250905" modified="200912070807" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200911250905" changecount="1">
<pre>[[另辟蹊径|http://ste.tiddlyspot.com/]]</pre>
</div>
<div title="StyleSheet" modifier="Steve" created="200701130013" modified="200912070803" tags="ClassicTheme" changecount="1">
<pre>/***
!TiddlyWiki Classic Color Scheme
Designed by Jeremy Ruston
http://tiddlystyles.com/#theme:Classic

To use this color scheme copy the [[ClassicTiddlyWiki]] contents into a tiddler and name it 'StyleSheet' also grab the [[ClassicTemplate]] and copy its contents into a tiddler named 'PageTemplate'.

!Colors Used
*@@bgcolor(#630):color(#fff): #630@@
*@@bgcolor(#930): #930@@
*@@bgcolor(#996633): #963@@
*@@bgcolor(#c90): #c90@@
*@@bgcolor(#cf6): #cf6@@
*@@bgcolor(#cc9): #cc9@@
*@@bgcolor(#ba9): #ba9@@
*@@bgcolor(#996): #996@@
*@@bgcolor(#300):color(#fff): #300@@
*@@bgcolor(#000000):color(#fff): #000@@
*@@bgcolor(#666): #666@@
*@@bgcolor(#888): #888@@
*@@bgcolor(#aaa): #aaa@@
*@@bgcolor(#ddd): #ddd@@
*@@bgcolor(#eee): #eee@@
*@@bgcolor(#ffffff): #fff@@
*@@bgcolor(#f00): #f00@@
*@@bgcolor(#ff3): #ff3@@
!Generic Rules /%==============================================%/
***/
/*{{{*/
body {
 background: #fff;
 color: #000;
}

a{
 color: #963;
}

a:hover{
 background: #963;
 color: #fff;
}

a img{
 border: 0;
}

h1,h2,h3,h4,h5 {
 background: #cc9;
}
/*}}}*/
/***
!Header /%==================================================%/
***/
/*{{{*/
.header{
 background: #300;
}

.titleLine {
 color: #fff;
 padding: 5em 0em 1em .5em;
}

.titleLine a {
 color: #cf6;
}

.titleLine a:hover {
 background: transparent;
}
/*}}}*/
/***
!Main Menu /%=================================================%/
***/
/*{{{*/
#mainMenu .button {
 color: #930;
}

#mainMenu .button:hover {
 color: #cf6;
 background: #930;
}

#mainMenu li{
 list-style: none;
}
/*}}}*/
/***
!Sidebar options /%=================================================%/
~TiddlyLinks and buttons are treated identically in the sidebar and slider panel
***/
/*{{{*/
#sidebar {
 background: #c90;
 right: 0;
}

#sidebarOptions a{
 color: #930;
 border: 0;
 margin: 0;
 padding: .25em .5em;
}

#sidebarOptions a:hover {
 color: #cf6;
 background: #930;
}

#sidebarOptions a:active {
 color: #930;
 background: #cf6;
}

#sidebarOptions .sliderPanel {
 background: #eea;
 margin: 0;
}

#sidebarOptions .sliderPanel a {
 color: #930;
}

#sidebarOptions .sliderPanel a:hover {
 color: #cf6;
 background: #930;
}

#sidebarOptions .sliderPanel a:active {
 color: #930;
 background: #cf6;
}
/*}}}*/
/***
!Sidebar tabs /%=================================================%/
***/
/*{{{*/
.tabSelected,.tabContents {
 background: #eea;
 border: 0;
}

.tabUnselected {
 background: #c90;
}

#sidebarTabs {
 background: #c90;
}

#sidebarTabs .tabSelected{
 color: #cf6;
 background: #963;
}

#sidebarTabs .tabUnselected {
 color: #cf6;
 background: #930;
}

#sidebarTabs .tabContents{
 background: #963;
}

#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tabSelected:hover{
 background: #930;
 color: #cf6;
}

#sidebarTabs .txtMoreTab .tabUnselected,
#sidebarTabs .txtMoreTab .tabUnselected:hover{
 background: #300;
 color: #cf6;
}

#sidebarTabs .txtMoreTab .tabContents {
 background: #930;
}

#sidebarTabs .tabContents a {
 color: #cf6;
 border: 0;
}

#sidebarTabs .button.highlight,
#sidebarTabs .tabContents a:hover {
 background: #cf6;
 color: #300;
}
/*}}}*/
/***
!Message Area /%=================================================%/
***/
/*{{{*/
#messageArea {
 background: #930;
 color: #fff;
}

#messageArea a:link, #messageArea a:visited {
 color: #c90;
}

#messageArea a:hover {
 color: #963;
 background: transparent;
}

#messageArea a:active {
 color: #fff;
}
/*}}}*/
/***
!Popup /%=================================================%/
***/
/*{{{*/
.popup {
 background: #eea;
 border: 1px solid #930;
}

.popup hr {
 color: #963;
 background: #963;
 border-bottom: 1px;
}

.popup li.disabled {
 color: #ba9;
}

.popup li a, .popup li a:visited {
 color: #300;
}

.popup li a:hover {
 background: #930;
 color: #eea;
}
/*}}}*/
/***
!Tiddler Display /%=================================================%/
***/
/*{{{*/
.tiddler .button {
 color: #930;
}

.tiddler .button:hover {
 color: #cf6;
 background: #930;
}

.tiddler .button:active {
 color: #fff;
 background: #c90;
}

.shadow .title {
 color: #888;
}

.title {
 color: #422;
}

.subtitle {
 color: #866;
}

.toolbar {
 color: #aaa;
}

.toolbar a,
.toolbar a:hover{
 border: 0;
}

.tagging, .tagged {
 border: 1px solid #fff;
 background-color: #ffc;
}

.selected .tagging, .selected .tagged {
 border: 1px solid #aa6;
 background-color: #ffc;
}

.tagging .listTitle, .tagged .listTitle {
color: #999999;
}

.footer {
 color: #ddd;
}

.selected .footer {
 color: #888;
}

.sparkline {
 background: #eea;
 border: 0;
}

.sparktick {
 background: #930;
}

.errorButton {
 color: #ff0;
 background: #f00;
}

.zoomer {
 color: #963;
 border: 1px solid #963;
}
/*}}}*/
/***
''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/
***/
/*{{{*/
.viewer .button {
 background: #c90;
 color: #300;
 border-right: 1px solid #300;
 border-bottom: 1px solid #300;
}

.viewer .button:hover {
 background: #eea;
 color: #c90;
}

.viewer .imageLink{
 background: transparent;
}

.viewer blockquote {
 border-left: 3px solid #666;
}

.viewer table {
 border: 2px solid #303030;
}

.viewer th, thead td {
 background: #996;
 border: 1px solid #606060;
 color: #fff;
}

.viewer td, .viewer tr {
 border: 1px solid #606060;
}

.viewer pre {
 border: 1px solid #963;
 background: #eea;
}

.viewer code {
 color: #630;
}

.viewer hr {
 border: 0;
 border-top: dashed 1px #606060;
 color: #666;
}

.highlight, .marked {
 background: #ff3;
}
/*}}}*/
/***
''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/
***/
/*{{{*/
.editor input {
 border: 1px solid #000;
}

.editor textarea {
 border: 1px solid #000;
 width: 100%;
}

.editorFooter {
 color: #aaa;
}

.editorFooter a {
 color: #930;
}

.editorFooter a:hover {
 color: #cf6;
 background: #930;
}

.editorFooter a:active {
 color: #fff;
 background: #c90;
}
/*}}}*/

/***
!css rule /%==============================================%/
***/
/*{{{*/
.viewer {font:18px Microsoft YaHei;} 
}

}
/*}}}*/</pre>
</div>
<div title="TagCloudPlugin" modifier="bamanzi" created="200802271531" modified="200803171508" tags="systemConfig">
<pre>/***
|Name|TagCloudPlugin|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|0.0.0|
|Author|Clint Checketts|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description||

!Usage
&lt;&lt;tagCloud&gt;&gt;

!Code
***/
//{{{
version.extensions.tagCloud = {major: 1, minor: 0 , revision: 0, date: new Date(2006,2,04)};
//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman


config.macros.tagCloud = {
 noTags: &quot;No tag cloud created because there are no tags.&quot;,
 tooltip: &quot;%1 tiddlers tagged with '%0'&quot;
};

config.shadowTiddlers.TagCloud=&quot;&lt;&lt;tagCloud&gt;&gt;&quot;;

config.macros.tagCloud.handler = function(place,macroName,params) {
 
var excludeTags = ['systemConfig', 'systemScript', 'systemTiddlers', 'excludeLists'];
var tagCloudWrapper = createTiddlyElement(place,&quot;div&quot;,null,&quot;tagCloud&quot;,null);

var tags = store.getTags();
for (var t=0; t&lt;tags.length; t++) {
  for (var p=0;p&lt;params.length; p++) if (tags[t][0] == params[p]) tags[t][0] = &quot;&quot;;
}

 if(tags.length == 0) 
   createTiddlyElement(tagCloudWrapper,&quot;span&quot;,null,null,this.noTags);
 //Findout the maximum number of tags
 var mostTags = 0;
 for (var t=0; t&lt;tags.length; t++) if (tags[t][0].length &gt; 0){
  if (tags[t][1] &gt; mostTags) mostTags = tags[t][1];
 }
 //divide the mostTags into 4 segments for the 4 different tagCloud sizes
 var tagSegment = mostTags / 4;
  
  for (var t=0; t&lt;tags.length; t++) if (tags[t][0].length &gt; 0){
 if (excludeTags.indexOf(tags[t][0])&gt;=0)  continue; 
 var tagCloudElement = createTiddlyElement(tagCloudWrapper,&quot;span&quot;,null,null,null);
 tagCloudWrapper.appendChild(document.createTextNode(&quot; &quot;));
 var theTag = createTiddlyButton(tagCloudElement,tags[t][0],this.tooltip.format(tags[t]),onClickTag,&quot;tagCloudtag tagCloud&quot; + (Math.round(tags[t][1]/tagSegment)+1));
  theTag.setAttribute(&quot;tag&quot;,tags[t][0]);
 }

};

setStylesheet(&quot;.tagCloud span{height: 1.8em;margin: 3px;}.tagCloud1{font-size: 1.2em;}.tagCloud2{font-size: 1.4em;}.tagCloud3{font-size: 1.6em;}.tagCloud4{font-size: 1.8em;}.tagCloud5{font-size: 1.8em;font-weight: bold;}&quot;,&quot;tagCloudsStyles&quot;);
//}}}</pre>
</div>
<div title="Treo" modifier="Steve" created="200911100314" tags="GTD GTD工具" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100314">
<pre>我用Treo是因为那个时候突然出了一批600，而且很便宜，所以一不小心就买了。其实对我来说，Treo做GTD并不是最佳选择。因为网络功能实在太烂了，而我的GTD[[网络工具]]又是我的主打，因此不推荐。

当然Treo的离线GTD功能实在是强得无以复加，比如传统的日历式工具Datebk6，用Custom Views非常方便回顾；Memoleaf是记事本，有强大的Tag功能，方便过滤；~DiddleBug是涂鸦工具，带抄送功能，是便利的收集箱；Bonsai则是大纲是工具，层次化清晰，用于架构六个高度。

这些固然都非常好，通过六个高度，由上至下，从Bonsai输出到Datebk6，知晓自己的任务；Memoleaf和~DiddleBug分别作为文本和手写的收集，便于处理。这样就完备了。但是我用大多数时间用的是Google Calendar，多是些琐事，图形界面操作，简便。所以很想要BlackBerry或是Android的手机，网络同步非常方便，无缝结合Google工具，这样就不用整天插来插去的了。

写完这个我突然感觉很强大，信手拈来，不像我写法律词条的时候，满大街地查来查去。</pre>
</div>
<div title="TspotSetupPlugin" modifier="YourName" created="200808081041" modified="200808081041" tags="systemConfig">
<pre>/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'ste';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != &quot;file:&quot;)
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(&lt;&lt;saveChanges&gt;&gt;)/,&quot;$1&lt;&lt;tiddler TspotSidebar&gt;&gt;&quot;);
	OptionsPanel = OptionsPanel.replace(/^/,&quot;&lt;&lt;tiddler TspotOptions&gt;&gt;&quot;);
	DefaultTiddlers = DefaultTiddlers.replace(/^/,&quot;[[WelcomeToTiddlyspot]] &quot;);
	MainMenu = MainMenu.replace(/^/,&quot;[[WelcomeToTiddlyspot]] &quot;);
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'TspotOptions':[
 &quot;tiddlyspot password:&quot;,
 &quot;&lt;&lt;option pasUploadPassword&gt;&gt;&quot;,
 &quot;&quot;
].join(&quot;\n&quot;),

'TspotControls':[
 &quot;| tiddlyspot password:|&lt;&lt;option pasUploadPassword&gt;&gt;|&quot;,
 &quot;| site management:|&lt;&lt;upload http://&quot; + config.tiddlyspotSiteId + &quot;.tiddlyspot.com/store.cgi index.html . .  &quot; + config.tiddlyspotSiteId + &quot;&gt;&gt;//(requires tiddlyspot password)//&lt;br&gt;[[control panel|http://&quot; + config.tiddlyspotSiteId + &quot;.tiddlyspot.com/controlpanel]], [[download (go offline)|http://&quot; + config.tiddlyspotSiteId + &quot;.tiddlyspot.com/download]]|&quot;,
 &quot;| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] &amp; [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|&quot;
].join(&quot;\n&quot;),

'WelcomeToTiddlyspot':[
 &quot;This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.&quot;,
 &quot;&quot;,
 &quot;@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &amp;nbsp;&amp;nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://&quot; + config.tiddlyspotSiteId + &quot;.tiddlyspot.com/controlpanel]] (your control panel username is //&quot; + config.tiddlyspotSiteId + &quot;//).&quot;,
 &quot;&lt;&lt;tiddler TspotControls&gt;&gt;&quot;,
 &quot;See also GettingStarted.&quot;,
 &quot;&quot;,
 &quot;@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &amp;nbsp;&amp;nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \&quot;save to web\&quot; button in the column on the right.&quot;,
 &quot;&quot;,
 &quot;@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &amp;nbsp;&amp;nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \&quot;upload\&quot; and your ~TiddlyWiki will be saved back to tiddlyspot.com.&quot;,
 &quot;&quot;,
 &quot;@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &amp;nbsp;&amp;nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].&quot;,
 &quot;&quot;,
 &quot;@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &amp;nbsp;&amp;nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions.&quot;
].join(&quot;\n&quot;),

'TspotSidebar':[
 &quot;&lt;&lt;upload http://&quot; + config.tiddlyspotSiteId + &quot;.tiddlyspot.com/store.cgi index.html . .  &quot; + config.tiddlyspotSiteId + &quot;&gt;&gt;&lt;html&gt;&lt;a href='http://&quot; + config.tiddlyspotSiteId + &quot;.tiddlyspot.com/download' class='button'&gt;download&lt;/a&gt;&lt;/html&gt;&quot;
].join(&quot;\n&quot;)

});
//}}}
</pre>
</div>
<div title="UploadLog" modifier="Steve" created="200912031455" modified="200912070812">
<pre>| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 04/12/2009 00:21:43 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 04/12/2009 00:26:58 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 04/12/2009 00:30:59 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 04/12/2009 00:40:00 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 04/12/2009 00:52:17 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 04/12/2009 01:08:28 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 04/12/2009 01:47:23 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 04/12/2009 01:50:31 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 07/12/2009 16:04:22 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |
| 07/12/2009 16:11:25 | Steve | [[ste.html|file:///D:/My%20Documents/My%20Dropbox/Public/ste.html]] | [[store.cgi|http://ste.tiddlyspot.com/store.cgi]] | . | [[index.html | http://ste.tiddlyspot.com/index.html]] | . | ok |</pre>
</div>
<div title="UploadPlugin" modifier="YourName" created="200808080918" modified="200912031454" tags="systemConfig">
<pre>/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date(&quot;Feb 24, 2008&quot;),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: &quot;store.php&quot;,
	defaultToFilename: &quot;index.html&quot;,
	defaultUploadDir: &quot;.&quot;,
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: &quot;Save and Upload this TiddlyWiki with UploadOptions&quot;,
	promptParamMacro: &quot;Save and Upload this TiddlyWiki in %0&quot;,
	saveLabel: &quot;save to web&quot;, 
	saveToDisk: &quot;save to disk&quot;,
	uploadLabel: &quot;upload&quot;	
};

config.macros.upload.messages = {
	noStoreUrl: &quot;No store URL in parmeters or options&quot;,
	usernameOrPasswordMissing: &quot;Username or password missing&quot;
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == &quot;http&quot;) 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		if (!params) params = {};
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) &amp;&amp; (document.location.toString().substr(0,4) == &quot;http&quot;)) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != &quot;http&quot;)
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser &amp;&amp; (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir &amp;&amp; uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement(&quot;markList&quot;);
		var listWrapper = document.createElement(&quot;div&quot;);
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue(&quot;listWrapper&quot;,listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == &quot;http&quot;) 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	options: [
		&quot;txtUploadUserName&quot;,
		&quot;pasUploadPassword&quot;,
		&quot;txtUploadStoreUrl&quot;,
		&quot;txtUploadDir&quot;,
		&quot;txtUploadFilename&quot;,
		&quot;txtUploadBackupDir&quot;,
		&quot;chkUploadLog&quot;,
		&quot;txtUploadLogMaxLine&quot;		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i&lt;this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = &quot;&quot;;
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n&lt;opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h &amp;&amp; h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,&quot;no&quot;);
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: &quot;Upload with options&quot;,
	step1Title: &quot;These options are saved in cookies in your browser&quot;,
	step1Html: &quot;&lt;input type='hidden' name='markList'&gt;&lt;/input&gt;&lt;br&gt;&quot;,
	cancelButton: &quot;Cancel&quot;,
	cancelButtonPrompt: &quot;Cancel prompt&quot;,
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: &quot;Description&quot;, type: 'WikiText'},
			{name: 'Option', field: 'option', title: &quot;Option&quot;, type: 'String'},
			{name: 'Name', field: 'name', title: &quot;Name&quot;, type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
};

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: &quot;The original file '%0' does not appear to be a valid TiddlyWiki&quot;,
	backupSaved: &quot;Backup saved&quot;,
	backupFailed: &quot;Failed to upload backup file&quot;,
	rssSaved: &quot;RSS feed uploaded&quot;,
	rssFailed: &quot;Failed to upload RSS feed file&quot;,
	emptySaved: &quot;Empty template uploaded&quot;,
	emptyFailed: &quot;Failed to upload empty template file&quot;,
	mainSaved: &quot;Main TiddlyWiki file uploaded&quot;,
	mainFailed: &quot;Failed to upload main TiddlyWiki file. Your changes have not been saved&quot;,
	//specific upload
	loadOriginalHttpPostError: &quot;Can't get original file&quot;,
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: &quot;The store script '%0' was not found.&quot;
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+&quot;\n...&quot;);
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty &amp;&amp; !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == &quot;file&quot;) {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == &quot;/&quot;)
		originalPath = originalPath + &quot;index.html&quot;;
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert(&quot;about to execute Http - GET on &quot;+originalPath);
	var r = doHttp(&quot;GET&quot;,originalPath,null,null,username,password,callback,uploadParams,null);
	if (typeof r == &quot;string&quot;)
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf(&quot;destfile:&quot;)+9,responseText.indexOf(&quot;\n&quot;, responseText.indexOf(&quot;destfile:&quot;)));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(&quot;.&quot;)) + &quot;.xml&quot;;
		var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is &quot;file&quot; !!!
		if (document.location.toString().substr(0,4) != &quot;file&quot;)
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) &amp;&amp; (responseText.indexOf(&quot;backupfile:&quot;) &gt; -1))  {
				var backupfile = responseText.substring(responseText.indexOf(&quot;backupfile:&quot;)+11,responseText.indexOf(&quot;\n&quot;, responseText.indexOf(&quot;backupfile:&quot;)));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf(&quot;destfile:&quot;)+9,responseText.indexOf(&quot;\n&quot;, responseText.indexOf(&quot;destfile:&quot;)));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload(&quot;ok&quot;);
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload(&quot;failed&quot;);			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf(&quot;nocache=&quot;) &lt; 0 ? url : url.substring(0,url.indexOf(&quot;nocache=&quot;)-1));
		if (xhr.status == 404)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf(&quot;Debug mode&quot;) &gt;= 0 )) {
			alert(responseText);
			if (responseText.indexOf(&quot;Debug mode&quot;) &gt;= 0 )
				responseText = responseText.substring(responseText.indexOf(&quot;\n\n&quot;)+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = &quot;---------------------------&quot;+&quot;AaB03x&quot;;	
	var uploadFormName = &quot;UploadPlugin&quot;;
	// compose headers data
	var sheader = &quot;&quot;;
	sheader += &quot;--&quot; + boundary + &quot;\r\nContent-disposition: form-data; name=\&quot;&quot;;
	sheader += uploadFormName +&quot;\&quot;\r\n\r\n&quot;;
	sheader += &quot;backupDir=&quot;+uploadParams[3] +
				&quot;;user=&quot; + uploadParams[4] +
				&quot;;password=&quot; + uploadParams[5] +
				&quot;;uploaddir=&quot; + uploadParams[2];
	if (bidix.debugMode)
		sheader += &quot;;debug=1&quot;;
	sheader += &quot;;;\r\n&quot;; 
	sheader += &quot;\r\n&quot; + &quot;--&quot; + boundary + &quot;\r\n&quot;;
	sheader += &quot;Content-disposition: form-data; name=\&quot;userfile\&quot;; filename=\&quot;&quot;+uploadParams[1]+&quot;\&quot;\r\n&quot;;
	sheader += &quot;Content-Type: text/html;charset=UTF-8&quot; + &quot;\r\n&quot;;
	sheader += &quot;Content-Length: &quot; + data.length + &quot;\r\n\r\n&quot;;
	// compose trailer data
	var strailer = new String();
	strailer = &quot;\r\n--&quot; + boundary + &quot;--\r\n&quot;;
	data = sheader + data + strailer;
	if (bidix.debugMode) alert(&quot;about to execute Http - POST on &quot;+uploadParams[0]+&quot;\n with \n&quot;+data.substr(0,500)+ &quot; ... &quot;);
	var r = doHttp(&quot;POST&quot;,uploadParams[0],data,&quot;multipart/form-data; ;charset=UTF-8; boundary=&quot;+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == &quot;string&quot;)
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + &quot;\n&quot; +
				store.allTiddlersAsHtml() + &quot;\n&quot; +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk(&quot;&lt;title&quot;+&quot;&gt;&quot;,&quot;&lt;/title&quot;+&quot;&gt;&quot;,&quot; &quot; + newSiteTitle + &quot; &quot;);
	revised = updateMarkupBlock(revised,&quot;PRE-HEAD&quot;,&quot;MarkupPreHead&quot;);
	revised = updateMarkupBlock(revised,&quot;POST-HEAD&quot;,&quot;MarkupPostHead&quot;);
	revised = updateMarkupBlock(revised,&quot;PRE-BODY&quot;,&quot;MarkupPreBody&quot;);
	revised = updateMarkupBlock(revised,&quot;POST-SCRIPT&quot;,&quot;MarkupPostBody&quot;);
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler(&quot;UploadLog&quot;);
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = &quot;UploadLog&quot;;
		this.tiddler.text = &quot;| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |&quot;;
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine &gt;= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length &gt; maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = &quot;\n| &quot;;
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString(&quot;0DD/0MM/YYYY 0hh:0mm:0ss&quot;) +&quot; | &quot;;
	text += config.options.txtUserName + &quot; | &quot;;
	text += &quot;[[&quot;+filename+&quot;|&quot;+location + &quot;]] |&quot;;
	text += &quot; [[&quot; + bidix.basename(storeUrl) + &quot;|&quot; + storeUrl + &quot;]] | &quot;;
	text += uploadDir + &quot; | &quot;;
	text += &quot;[[&quot; + bidix.basename(toFilename) + &quot; | &quot; +toFilename + &quot;]] | &quot;;
	text += backupDir + &quot; |&quot;;
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(&quot; &quot;+status+&quot; |&quot;);
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  &amp;&amp; 
			((ext.major &gt; major) || 
			((ext.major == major) &amp;&amp; (ext.minor &gt; minor))  ||
			((ext.major == major) &amp;&amp; (ext.minor == minor) &amp;&amp; (ext.revision &gt;= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push(&quot;Requires &quot; + plugin + &quot; &quot; + major + &quot;.&quot; + minor + &quot;.&quot; + revision);
			eval(plugin); // generate an error : &quot;Error: ReferenceError: xxxx is not defined&quot;
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf(&quot;/&quot;)) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf(&quot;\\&quot;));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf(&quot;#&quot;)) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf(&quot;/&quot;)) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf(&quot;\\&quot;)+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin(&quot;PasswordOptionPlugin&quot;, 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',&quot;uploadPluginStyles&quot;);

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: &quot;Url of the UploadService script (default: store.php)&quot;,
	txtUploadFilename: &quot;Filename of the uploaded file (default: in index.html)&quot;,
	txtUploadDir: &quot;Relative Directory where to store the file (default: . (downloadService directory))&quot;,
	txtUploadBackupDir: &quot;Relative Directory where to backup the file. If empty no backup. (default: ''(empty))&quot;,
	txtUploadUserName: &quot;Upload Username&quot;,
	pasUploadPassword: &quot;Upload Password&quot;,
	chkUploadLog: &quot;do Logging in UploadLog (default: true)&quot;,
	txtUploadLogMaxLine: &quot;Maximum of lines in UploadLog (default: 10)&quot;
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


// Backstage
merge(config.tasks,{
	uploadOptions: {text: &quot;upload&quot;, tooltip: &quot;Change UploadOptions and Upload&quot;, content: '&lt;&lt;uploadOptions&gt;&gt;'}
});
config.backstageTasks.push(&quot;uploadOptions&quot;);


//}}}

</pre>
</div>
<div title="Wiki" modifier="Steve" created="200911071611" modified="200911071611" tags="Wiki 知识管理" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911071611">
<pre>[[Wiki]]是一种支持标签和关键词的[[知识管理]]方式。</pre>
</div>
<div title="steve" modifier="Steve" created="200912031229" modified="200912031554" tags="传记" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200912031229" changecount="1">
<pre>就是本人，见[[关于自己]]。</pre>
</div>
<div title="《民法》" modifier="Steve" created="200911200222" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911200222">
<pre>魏振瀛
目录
第一编　总论
　第一分编　绪论
　　第一章　民法概述
　　第二章　民法的基本原则
　　第三章　民事法律关系
　第二分编　民事权利主体
　　第四章　自然人
　　第五章　法人
　　第六章　非法人组织
　第三分编　民事权利客体
　　第七章　民事权利客体的种类
　第四分编　民事权利变动
　　第八章　民事行为
　　第九章　代理
　　第十章　诉讼时效、除斥期间与期限
第二编　物权
　第十一章　物权总论
　第十二章　所有权
　第十三章　共有
　第十四章　用益物权
　第十五章　担保物权
　第十六章　占有
第三编　债权
　第一分编　债权总论
　　第十七章　债的概述　
　　第十八章　债的类型
　　第十九章　债的履行
　　第二十章　债的保全和担保
　　第二十一章　债的移转和消灭
　第二分编　债权分论
　　第二十二章　合同概述
　　第二十三章　合同的订立
　　第二十四章　双务合同履行中的抗辩权
　　第二十五章　合同的变更和解除
　　第二十六章　缔约过失责任与违约责任
　　第二十七章　各种合同
　　第二十八章　无因管理之债
　　第二十九章　不当得利之债
第四编　继承权
　第三十章　继承权概述　
　第三十一章　法定继承　
　第三十二章　遗嘱继承、遗赠与遗赠扶养协议　
　第三十三章　遗产的处理
第五编　人身权
　第三十四章　人身权概述　
　第三十五章　人格权
　第三十六章　身体权
第六编　侵权责任
　第三十七章　侵权责任概述　
　第三十八章　侵权行为的归责原则　
　第三十九章　一般侵权行为的构成要件　
　第四十章　侵害财产权与人身权的行为与责任
　第四十一章　共同侵权行为与责任
　第四十二章　各类侵权责任
　第四十三章　侵权责任的承担
缩略语
词条索引　
第一版后记　
第二版后记　
第三版后记</pre>
</div>
<div title="《民法原论》" modifier="Steve" created="200911200223" modified="200911200400" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911200400">
<pre>马俊驹 余延满
目录
第一编 民法总论
　第一章 民法概述
　　第一节 民法的概念
　　第二节 民法的本位与性质
　　第三节 民法与邻近法律部门的关系
　　第四节 民法的历史发展
　　第五节 我国民法的渊源
　第二章 我国民法的基本原则
　　第一节 民法基本原则概述
　　第二节 民事主体地位平等原则
　　第三节 自愿原则
　　第四节 公平原则
　　第五节 诚实信用原则
　　第六节 公序良俗原则
　第三章 民事法律关系
　　第一节 民事法律关系概述
　　第二节 民事法律关系的主体
　　第三节 民事法律关系的内容
　　第四节 民事法律关系的客体
　　第五节 民事法律事实
　第四章 自 然 人
　　第一节 自然人的民事权利能力
　　第二节 自然人的民事行为能力
　　第三节 自然人的民事责任能力
　　第四节 自然人的住所
　　第五节 自然人的人身权
　第五章 法 人
　　第一节 法人的概念与本质
　　第二节 法人的分类
　　第三节 法人的设立与成立
　　第四节 法人的民事能力
　　第五节 法人的机关
　　第六节 法人的财产与责任
　　第七节 企业法人的分支机构与代理机构
　　第八节 法人的变更和终止
　　第九节 法人的人格权力
　第六章 合 伙
　　第一节 合同的概念和历史发展
　　第二节 合伙的民事主体地位
　　第三节 合伙的成立要件
　　第四节 合伙人的出资与合伙财产
　　第五节 合伙的债务承担
　　第六节 合伙的内部关系
　　第七节 退伙和入伙
　　第八节 合伙的终止
　　第九节 特种合伙
　第七章 国 家
　　第一节 国家的民事主体地位
　　第二节 国家成为民事主体的途径
　第八章 民事法律行为
　　第一节 民事法律行为的概念与特征
　　第二节 民事法律行为的种类
　　第三节 民事法律行为的成立与有效要件
　　第四节 意思表示
　　第五节 附条件与附期限的民事法律行为
　　第六节 无效民事法律行为
　　第七节 可撤销民事法律行为
　　第八节 民事法律行为无效或被撤销的效力
　　第九节 效力未定的民事法律行为
　第九章 代 理
　　第一节 代理概述
　　第二节 代理权
　　第三节 代理行为
　　第四节 无权代理
　第十章 诉讼时效和期限
　　第一节 民事时效概述
　　第二节 诉讼时效
　　第三节 诉讼时效期间
　　第四节 期限
第二编 物权法
　第一章 物权法概述
　　第一节 物权法的概念及其编制体例
　　第二节 物权法的原则
　第二章 物 权
　　第一节 物权的概念和种类
	第二节 物权的效力
	第三节 物权的变动
	第四节 物权的公示
　第三章 所有权
	第一节 所有权概述
	第二节 所有权的权能
	第三节 所有权的取得
	第四节 共有
	第五节 建筑物区分所有权
	第六节 相邻关系
　第四章 用益物权
	第一节 用益物权概述
	第二节 建设用地使用权
	第三节 土地承包经营权
	第四节 宅基地使用权
	第五节 地役权
　第五章 担保物权
	第一节 担保物权概述
	第二节 抵押权
	第三节 质权
	第四节 留置权
	第五节 优先权
	第六节 物的担保的竞合
　第六章　占有
	第一节 占有概述
	第二节 占有的分类
	第三节 占有的取得与消灭
	第四节 占有的效力
第三编　合同法
　第一章　合同法概述
	第一节 合同法的概念与特征
	第二节 合同法的原则
　第二章　合同概述
	第一节 合同的概念与特征
	第二节 合同的分类
	第三节 合同关系
　第三章　合同的成立
	第一节 合同的成立概述
	第二节 合同成立的防护四
	第三节 合同的条款
	第四节 合同的形式
	第五节 合同成立的时间和地点
	第六节 缔约过失责任
　第四章　合同的担保
	第一节 合同的担保
	第二节 保证
	第三节 定金
　第五章　合同的履行
	第一节 合同的履行概述
	第二节 合同的履行规则
	第三节 双务合同履行中的抗辩权
	第四节 合同履行的保全
　第六章　合同的变更和转让
	第一节 合同的变更
	第二节 合同转让的概述
	第三节 债权让与
	第四节 债务承担
	第五节 合同承受
　第七章　合同的权利义务终止
	第一节 合同权利义务终止概述
	第二节 合同解除
	第三节 抵消
	第四节 提存
	第五节 混同
	第六节 免除
　第八章　违约责任
	第一节 违约责任的概念与特征
	第二节 违约责任的归责原则
	第三节 违约形态及其法律后果
	第四节 违约责任的形式
	第五节 免责事由
　第九章　转让财产所有权的合同
	第一节 转让财产所有权的合同概述
	第二节 买卖合同
	第三节 供用电、水、气、热力合同
	第四节 互易合同
	第五节 赠与合同
	第六节 借款合同
　第十章　使用财产的合同
	第一节 使用财产合同概述
	第二节 租赁合同
	第三节 建设工程合同
　第十一章　完成工作的合同
	第一节 完成工作合同的概述
	第二节 承揽合同
	第三节 建设工程合同
　第十二章　提供服务的合同
	第一节 提供服务合同的概述
	第二节 运输合同
	第三节 保管合同
	第四节 仓储合同
	第五节 委托合同
	第六节 行纪合同
	第七节 居间合同
　第十三章　技术合同
	第一节 技术合同概述
	第二节 技术开发合同
	第三节 专利实施许可合同
	第四节 技术转让合同
	第五节 技术咨询合同和技术服务合同
　第十四章　准契约
	第一节 准契约概述
	第二节 无因管理
	第三节 不当得利
第四编　亲属法
　第一章　亲属法概述
	第一节 亲属法的性质与编制体例
	第二节 亲属法调整对象的范围与内容
	第三节 亲属法的原则
　第二章　亲属
	第一节 亲属的含义与分类
	第二节 亲系和亲等
	第三节 亲属关系的发生和终止
  第三章  婚姻
  	第一节 婚姻概述
	第二节 婚姻的成立
	第三节 婚姻的有效
	第四节 无效婚姻
	第五节 可撤销婚姻
	第六节 婚姻被确认无效或被撤销的效力
	第七节 婚姻的人身效力
	第八节 夫妻财产制
	第九节 离婚制度的概述
	第十节 协议离婚
	第十一节 诉讼离婚
  第四章 父母子女
  	第一节 父母子女关系的概念、种类及沿革
	第二节 亲生子女
	第三节 养子女
	第四节 继子女
	第五节 亲权
  第五章  监护
  	第一节 监护制度的概述
	第二节 未成年人的监护
	第三节 成年的精神病人的监护
  第六章  扶养
  	第一节 扶养的概念与法律特征
	第二节 扶养的范围与成立要件
第五编　继承法
  第一章  继承法概述
  	第一节 继承法的概念与立法体例
	第二节 我国继承法的原则
  第二章  继承权
  	第一节 继承权的概念与性质
	第二节 继承权的主体
	第三节 继承权的客体 
	第四节 继承权的取得和丧失
	第五节 继承权的放弃
	第六节 继承权的保护
  第三章  法定继承
  	第一节 法定继承的概念和适用范围
	第二节 法定继承的范围、顺序和法定应继份
	第三节 代位继承与转继承
	第四节 酌情分得以产权
  第四章  遗嘱继承
  	第一节 遗嘱继承概述
	第二节 遗嘱
	第三节 遗嘱的撤回
	第四节 遗嘱的执行
  第五章  遗赠与遗赠扶养协议
  	第一节 遗嘱
	第二节 遗赠抚养协议
  第六章  遗产的处理
  	第一节 继承的开始于遗产的管理
	第二节 遗产的分割
	第三节 无人继承又无人受遗赠的遗产处理
第六编　侵权行为法
  第一章  侵权行为法概述
  	第一节 侵权行为法的概念
	第二节 侵权行为法保护的对象
  第二章  侵权行为法的概念与分类
  	第一节 侵权行为的概念
	第二节 侵权行为的分类
  第三章  侵权行为法的归责原则
  	第一节 侵权行为归责原则概述
	第二节 过错责任原则
	第三节 无过失责任原则
	第四节 公平责任原则
  第四章  侵权行为的构成要件
  	第一节 侵权行为构成要件
	第二节 违法行为
	第三节 损害事实
	第四节 因果关系
	第五节 过错
  第五章  共同侵权行为
  	第一节 共同加害行为
	第二节 共同危险行为
	第三节 教唆、帮助行为
  第六章  侵权民事责任及其抗辩事由
  	第一节 侵权民事责任形式概述
	第二节 侵权损害赔偿
	第三节 民事制裁方式
	第四节 侵权民事责任的抗辩事由
  第七章  民事责任竞合
  	第一节 民事责任的竞合概述
	第二节 侵权责任与违约责任的竞合
	第三节 返还不当得利责任与侵权责任的竞合
  第八章  侵害财产权的民事责任
  	第一节 侵害财产权民事责任概述
	第二节 侵害动产和不动产的民事责任
	第三节 侵害和合同债权的民事责任
  第九章  侵害人身权的民事责任
  	第一节 侵害人身权民事责任概述
	第二节 侵害姓名权或名称权的民事责任
	第三节 侵害肖像权的民事责任
	第四节 侵害名誉权的民事责任
  第十章  特殊侵权的民事责任
  	第一节 产品责任
	第二节 高度危险作业致人损害的民事责任
	第三节 环境污染致人损害的民事责任
	第四节 工作物致人损害的民事责任
	第五节 地面施工致人损害的民事责任
	第六节 动物致人损害的民事责任
	第七节 监护人的民事责任
第七编　民法的适用
  第一章  民法适用的概念、范围和原则
	第一节 民法适用的概念与特征
	第二节 民法的适用范围
	第三节 民法适用的原则
  第二章  民法的解释与漏洞的补充
  	第一节 民法的解释
	第二节 民法漏洞的补充
  第三章  涉外民事关系的法律适用
  	第一节 涉外民事关系法律适用概述
	第二节 几种涉外民事关系的法律适用
后记
</pre>
</div>
<div title="为什么要用软件" modifier="Steve" created="200911100331" modified="200911111823" tags="软件" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911111823">
<pre>有的事情，自己凭手工真的搞不定，比如从各地复制完成自己几万字的论文，比如看许许多多电影院看不到的片子，比如把照片弄得像帅哥一样……

计算机帮了我们很多忙，不过很多时候是倒忙。

很多人连个计算机都搞不定，被无聊问题耍地晕头转向，比如教授。

像我则是用得很溜，但是这个过程花费了我大量的时间。我不想大家走我的老路，所以决定搞一个[[软件推荐]]，提高使用效率。

如果有人有教授的知识，我的电脑技术，那样就NB了。

教授上课收钱的的，我这个不要钱，不过一般不要钱的大家都不会重视的。</pre>
</div>
<div title="使用WikiBar" modifier="Steve" created="200911072039" modified="200911072040" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911072040">
<pre>宿舍
----
__终于搞定了__</pre>
</div>
<div title="信赖利益" modifier="Steve" created="200911111108" modified="200911111131" tags="法学 民法 名词解释" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911111131">
<pre>信赖利益一词源于大陆法的损害赔偿制度和英美法上的违约救济制度。

如果是买卖合同，被欺诈方的信赖利益是基于对对方合理的信赖而对履行合同做的必要准备而支持的费用，信赖利益的赔偿原则就是使善意的被欺诈方的地位恢复到订约之前。

信赖利益又称为消极利益

国外的立法一般是信赖利益以不超过履行利益为原则。当事人履行合同义务的目的是为了获得履行利益，如果信赖利益超出履行利益，实际上就超出了当事人在订立合同时的预期，就是不合理的。

期待利益与信赖利益两者之间有以下几点不同：
第一，两者的内涵不同。期待利益是指当事人在订立合同时期望通过合同履行获得的各种利益的总和，包括合同履行后可以获得的利益和因违约而导致的现有财产的减损灭失和费用的支出。信赖利益是指无过错的一方当事人信赖合同完满履行，在订立和履行合同中支出的费用和代价。
第二，对两者保护达到的状态不同。对于期待利益的保护可使合同在被违反的情况下达到合同被履行的状态，保护期待利益可替代合同的履行。而保护信赖利益旨在使非违约方因信赖合同的履行而支付的各种费用得到返还，从而使当事人恢复到合同订立之前的良好状态。第三，违约损害赔偿一般应适用期待利益，只有当期待利益无法计算而合同又不存在继续履行的可能时才适用信赖利益。</pre>
</div>
<div title="关于以后" modifier="Steve" created="200912031154" modified="200912031155" tags="关于" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200912031155">
<pre>未来的事，我往往不多作考虑，更多的时候，我倒宁愿回味中午的那碗红烧肉以及食堂里邂逅的美女并盘算晚上要不要出去上自习。然而到了夜深人静的时候，总不免考虑一下将来，然后渐渐入睡。

首先，我会很快毕业。我觉得，我将不会在系里继续读研。因为，今年考试复习的时候，我看到葵花宝典上写明几道必考的题，并特别注明，不会做就不用搞这行了，回家搞点别的去吧。然而考试的时候，我真的没做出来，因此我对读研彻底丧失了信心。至于别的系的研究生，我还没有太多想法，以后再说吧。

毕业以后，我就跑出去挣钱，我要赚很多很多的钱，用一句我们可爱的yp同学的话来说：“等我有钱了，我也要带一个女朋友回宿舍来，我要周游世界，我要买一架私人飞机......”总之，经我们概括，就是可以为所欲为了。至于我的赚钱方法，大致就是找一个好一点的工作，可以不用跑来跑去，只要每天坐在电脑前，偶尔开个会，或者给下面的人开个会，如果能有个独立办公室就更好了，假如再配一个美女秘书就……。

说到mm，我也想找一个，就如广大水深火热中的男同胞一样。只是在大学，估计是找不到了。因为每次出去打篮球的时候，我们都有在出手时叫一个或多个mm名字的习惯，这个时候，其他人都会因某一个或多个mm而发飚狂进。我则是叫谁都不灵，导致把全系mm的名字都喊遍的时候我也没进球。但这不能说是我水平差，我投篮照样可以很准，只要是在篮下的时候。所以我就总结出来了，咱们系的mm与我无缘，至于别的系的mm，以后再说吧。

我打算，等我到了三十左右的时候，就骗个漂亮贤惠的mm回来，之所以用骗而不是其他的诸如娶之类的好听词汇，是因为那样不太现实。我会告诉她我能包揽所有家务，及时上交全部工资并不看任何别的mm一眼。之所以是漂亮贤惠而不是其他诸如聪明可爱之类惯用词组，是因为我需要她成熟并且懂得事理，而太聪明的话会比较不太好骗。我希望她可以给我烧饭做菜洗衣服(鉴于这个原因，我决定放弃倪导给我们布置的学做菜的寒假任务），不要阻止我看各种各样的电视节目，并且不逼迫我看诸如韩剧之类的无聊电视，可能的话，陪我一起打个CS、实况之类，千万别找我玩连连看，至于逛街，我还要考虑一下。

如此这般过上几年，

然后我还要一个mm......

看到这里的时候，大家开始纷纷指责唾骂我如何如何不厚道，其实大家误会了，我只是想要一个女儿而已，并没有任何不人道的地方。至于为什么是女儿而不是儿子，只是因为一次打篮球的时候（因为我们坚信篮球是主导mm的重要因素），最后到了罚篮的垃圾时间，sp投篮出手前说投进了就生一个儿子，于是他没天理得进了。接着是yhr，他也说投进就要儿子，然后他攒了很多年的人品就用掉了。我窃以为自己技术虽略胜他们，但运气不足，故说投进就生一个女儿，结果老子也破天荒进了。我在他们两个ws男狂笑中比划篮筐的大小，也没发现异样。最终总结出一个道理：做人不能太谦虚。不过，女儿又怎样，据说女儿会像爹比较多，那样的话，我的完美基因就可以顺利地流传下去了，到时候，sp以及yhr的那两个臭小子还不是得整天围着我女儿转？哈哈，暗笑一个先......不过，反正是女儿就对了，她出生以后，我要教她高等数学、三大力学以及女子防身术......

再后来，我就老了，退休了以后，整天在家里写书法，写了很多很多，然后拿出去卖......卖废纸......唉，刚说的，做人不要太谦虚。应该是，到我老的时候，跑到全国各地去题字，大楼、商场、饭店、会馆、青楼、厕所......照单全收，能写的地方都写了，最后人民币上也有我的题字，只不过因毁坏人民币罪关了几天......

再然后，我就病了，睡了很久也没有睡醒。一天下午，忽然听见妈妈叫我，于是起床去妈妈卧室，结果妈妈正好好地睡着呢，根本没有叫我，回去接着睡，可一看，我也安安稳稳地躺在床上呢，我心中一乐，这是多么难得的机会啊。于是我悄悄溜了出去，来到小时候常去的游戏机厅，找了一台拳皇的机子坐了下来，那时候的拳皇也不知道出到二零几几了，反正一个人都不认识，随便选了三个貌似很强的人，continue了约莫有二十几回，也没有打通。我气愤了，一看时间也不早了，只好回家。

到家的时候，只听得里面声音吵闹，进去一看，只见一群亲戚围在我床边，哭天抢地，我问我弟怎么回事，他只是一个劲地老泪纵横，根本就不理我。我突然间明白，他们都已经抛弃我，撇下我不管了。我惟有黯然离开。

我在外面游荡了很久，也没觉出肚饿。只有整天的无所事事，很是无聊。我猛然回想起我的另一个家——清华。于是日夜兼程，搭上了开往北京的火车。又来到了熟悉的宿舍410。从此以后，踮起脚尖，静静生活。</pre>
</div>
<div title="关于循环" modifier="Steve" created="200912031152" modified="200912031442" tags="关于" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200912031442">
<pre>今天是星期三，我们亲爱的[[steve]]同学十分不爽。早上难得大家第一节没有课，想要睡个好觉，做梦正到精彩部分，却被[[yp]]的无敌震撼的七点诺基亚手机闹钟吵醒，而定闹钟的人却没有半点要起床的意思。原本已经带了静音耳塞防他这一手，没想到这次竟然是连响带震，又由于床板的某种特殊结构，起到了放大作用，直接震到后脑勺。steve唰的掀开被子，骂了些谁也听不懂的方言：“#%*%$#@!^&amp;*?!”回头对同样被吵醒的[[sp]]抱怨道：“都是的叫p的，差距怎么就这么大呢？”

sp也起身，回对道：“日本人也有个人字，可那也能叫人吗？”
steve问：“叫p的不是p，那是什么？”
sp答曰：“b。”
steve恍然大悟：“原来你是sb啊！”
sp反驳：“非也，我原是super，现在是superb。”
steve又问：“那他是什么？”
sp回答：“yb。”
steve：“不懂。”
sp义愤填膺道：“他那就是有病！”

yp安然睡到九点十五，才轰轰烈烈地开始起床，先是哼着曲风独特的原创小调，翻看着床头一本看了快有三年的不知道什么书，看了不到半页，把书一丢，鱼跃下床，于是什么梯子、凳子、桌子、脸盆、牙缸一并作响，好似开了一个摇滚演唱会，当即音量超过80分贝，直逼[[yhr]]的睡眠临界音量90分贝。这一吵，sp和steve都坐不住了，起身摔门而去，瞬时音量达到100。yhr震颤了一下，随后舒了一口气，摘掉耳机，起身扫视宿舍，发现只有yp一人仍在那边踱来踱去，手里拿着的却是自己昨天在图书馆好不容易淘到的《电影赏析》，顿时气不打一处来。质问道：“我让你看了吗？！”yp也不回答，转身把书一丢，出门去刷牙。yhr骂道：“都是叫y的，差距怎么就这么大呢！”于是快速收拾洗漱完毕，起身离开。

于是，携带着极度不爽的三位青年就这样出发了，开始了一天的征程。
!steve篇

steve冲出去的时候，撞到了隔壁刚起床洗漱的[[six]]，撞得他满身牙膏沫子，six十分恼火，正要发作，却被其次冲出来的sp再度撞到，溅了一身的水。转身就是一拳，不料打在墙上，疼得厉害，露出很大的破绽。两人趁机逃脱，瞬间不见踪影。six火冒三丈，却又无处发作，只好回宿舍把衣服脱了丢予[[stalle]]，嚷道：“快给我洗了！”stalle感到莫名其妙，但她也不是吃素的，又把衣服砸过去，“你不是有很多女人吗？随便叫一个来洗好了！”这一闹，就把昨晚熬夜的[[super Li]]给吵醒了。Li很是不悦，嘟哝道：“女人。”遂穿着发黄兼泛黑的小裤衩下床。six见状，赶紧带着stalle走人，以免看到不该看的。[[bnlcblgmdn]]一直蹲守在宿舍里，原本打算抓住机会多偷看stalle几眼，甚至趁six不在上去搭个讪，毕竟[[女朋友]]不在身边嘛，可以理解。谁知stalle这么快就走了，直怪Li冒失。乃出门携伤员[[xucc]]去上课，一路狂飙疾走，吓得xucc魂飞魄散，硬汉形象全无。

话说Li起来之后，灌了约莫有7个人分量的矿泉水，才出去上课。到了教室，照例坐了第一排，并且身体极度后仰。由于饮水过多，新陈代谢过旺，又长年不曾打理，头发自然就散发出岁月的味道。后排的[[moon Li]]被熏得受不了了，但是碍于正在上课不好发作，只能心中暗骂，“都是姓Li的，差距怎么就这么大呢？！”下课回到宿舍，moon还是觉得身上仍有残留的味道，十分恼火，于是大开门窗，彻底换气。床上午睡的[[waiting]]被冷风吹醒，按照惯例，感冒了。遂到处借药，大家都说没有，而[[ocean]]提议问问女生。打过去好几通电话，一直都是占线。最终在waiting的不懈努力下，终于在[[LL]]处借到感康一粒。ocean见了，十分眼熟，审视之，大喝：“这就是我以前给她的！”遂想起过去的林林总总，一幕幕闪现在眼前，心里像是打翻了五味瓶，什么滋味都有。顿时来了感觉，引吭高歌，“我不想我不想不想长大……”这一唱，烦了宿舍里正在看小电影的[[zz]]和[[ff]]，一下子破坏了氛围，ff看了一阵觉得低级趣味，于是就走了。zz的圆满计划遭到破坏，心中郁闷，独自又啃起了手指。
!sp篇

sp在撞门之后，才发现太匆忙，手机忘了带，但是因为遇上暴力事件不能回去，而且那样的鬼地方也实在是懒得回去，想想也不会有什么太大关系，于是继续前进。自习到了第大二节，才去上固物课，看见远处走来的[[garrent]]猥琐一笑，便冲着自己奔了过来，瞬间已在跟前，还没来得及反应便中了一拳。“小子你想不想混了，大哥给你发短信你都不回，电话也不接。”看到苗头不对，sp立刻满脸堆笑，“主席误会了，今天忘带手机了。”“忘带？你说得倒轻巧，我们文化节的赞助就差点让你搞没了！”garrent满脸怒色，“一点基本职业素养都没有，这些事还得劳我亲自动手。”愤愤离去。garrent下课后到回宿舍，赶紧开了电脑联系各系负责人，商量各项事宜。同寝[[zyl]]嫌没事可干，乃盛情邀请garrent打魔兽。garrent头也不回，推说有公事。zyl自从找了[[师妹]]之后一直气焰很盛，当下就怒了，“去你妈的公事，工作有魔兽重要吗？”答曰：“有。”遂感到自己价值观受到否定，闷闷不乐ing。
!yhr篇

yhr每天一定不会忘记的东西就是忘记东西。今天照例，忘带了[[easy]]的固物作业，到了教室才发现，所以easy只能晚交。下午easy拿回自己的作业，交给课代表Li，谁知Li已经交掉作业，现在正在补觉，一时半会儿是起不来了，所以自己只能跑一趟系馆。郁闷之余，顺便叫上准备出去自习的[[jimmy]]同去。由于心情不爽，easy连车也懒得骑了，便让jimmy骑车带他。到了系馆交了作业，出来已经没了自行车的踪影。jimmy掰了掰手指，叹了口气，“第8辆了。”自习也不去了，两人在主干道上闲逛，遇上出来上自习的[[cui]]，于是一人引诱，一人生抢，总之就是把自行车给夺了过来，jimmy一脚踩到底，瞬间闪掉两人。小cui没了自行车，却没有丧失自习的动力。跑到六教，正巧碰到[[ly]]和ly女郎，便厚着脸皮上去预约ly的自行车，希望晚上回去时可以搭便车。ly碍于同学感情不好拒绝，只好答应，但心里乃是十分不爽，和[[mm]]同回的计划泡了汤，极其郁闷。
尾声

今天这一天，[[51班]]的所有同学都心情很不爽，而且都很莫名其妙。尤其是steve、sp、yhr三人，无处泄愤，于是找人打游戏。steve找到easy打[[拳皇]]，却不知easy也是郁闷发飙，连打了三个perfect，顿时脸面全无；sp找moon挑[[cs]]，moon正好拿他练手泄愤，枪枪爆头，打得sp毫无还手之力；yhr更不明智，去找zz玩[[实况]]，zz把下午没使的力气全使在了球场上，半场比分就上了两位数。于是这三个青年愈发郁闷得回到了宿舍。宿舍里，yp正在边看视频边看小说边聊qq边听音乐边狂笑，爽到不行。而此时steve晒在阳台的衣服，又被新晾上去的刚从水里捞出来的衣服给重新弄湿了；sp的垃圾筐里，满出了各式零食水果的垃圾；yhr的《电影赏析》横尸在桌子上，上面散落着饼干末子。三位青年都已经怒不可遏了，steve已经拔出[[手枪]]，sp抽出了皮带，yhr找出了久违的[[黄色水果刀]]。所有的愤怒，所有的不满，所有的郁闷都已经找到了源头，他们需要一个出口。上膛、抽带、拔刀，动作是那么的协调统一，灯光一闪，就是此刻！

“嘿嘿，哇哈哈，你们几个干什么呢？”门口突然进来[[yy]]。

“准备洗漱呢……”三人异口同声。

“这样啊，那早点睡吧！”

“知道了。”

就这样，最后他们还是没有下手，日子还是继续这样过。三位青年总结出来了，这是一个心情恶性循环，没人可以幸免，然而yp不在循环之中，他是[[无效状态]]，并且他会[[自启动]]。 </pre>
</div>
<div title="关于自己" modifier="Steve" created="200911250913" modified="200912070809" tags="关于" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" server.page.revision="200912031433" changecount="4">
<pre>[[我]]从高中起写的大部分作文都以关于开头的，其中比较经典的有[[关于以后]]、[[关于循环]]。所以，写这类文章总是驾轻就熟，信手拈来。
然而现在要写个关于自己，突然发现难以下手。评论别人总是 容易，事情轮到自己，就不那么好办了。
我总是喜欢隔岸观火，甚至观火还不够，还要做个狙击手，朝对岸再来上几枪。
其实来上几枪也无所谓，反正都是要烧掉的东西，没有期待可能性。
说了这几句，其实我的本性已经暴露出来了……
另外再补充一点个人情况：
男，伪帅哥。
南，180，130。
难，找女朋友真难！

看文章可点击标签：
&lt;&lt;tagCloud&gt;&gt;</pre>
</div>
<div title="十枚" modifier="Steve" created="200911100344" modified="200911100642" tags="软件" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100642">
<pre>之所以精选十个软件，是为了体现少的力量。

之所以叫十枚，是因为师妹总是美好的事物。

不过我的师妹是用Windows的，其他系统的师妹请无视。</pre>
</div>
<div title="合同法" modifier="Steve" created="200911080728" tags="法学 民法 法条" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911080728">
<pre>中华人民共和国合同法
　　　（１９９９年３月１５日第九届全国人民代表大会第二次会议通过）

　　　　　　　　　　　　　　　　　总则
　　第一章　一般规定
　　第二章　合同的订立
　　第三章　合同的效力
　　第四章　合同的履行
　　第五章　合同的变更和转让
　　第六章　合同的权利义务终止
　　第七章　违约责任
　　第八章　其他规定
　　　　　　　　　　　　　　　　　分则
　　第九章　买卖合同
　　第十章　供用电、水、气、热力合同
　　第十一章　赠与合同
　　第十二章　借款合同
　　第十三章　租赁合同
　　第十四章　融资租赁合同
　　第十五章　承揽合同
　　第十六章　建设工程合同
　　第十七章　运输合同
　　第十八章　技术合同
　　第十九章　保管合同
　　第二十章　仓储合同
　　第二十一章　委托合同
　　第二十二章　行纪合同
　　第二十三章　居间合同
　　　　　　　　　　　　　　　　　附则

　　　　　　　　　　　　　　　　总则


　　　　　　　　　　　　　第一章　一般规定


　第一条　为了保护合同当事人的合法权益，维护社会经济秩序，促进社会主义现代化建设，制定本法。

　第二条　本法所称合同是平等主体的自然人、法人、其他组织之间设立、变更、终止民事权利义务关系的协议。
　　婚姻、收养、监护等有关身份关系的协议，适用其他法律的规定。

　第三条　合同当事人的法律地位平等，一方不得将自己的意志强加给另一方。

　第四条　当事人依法享有自愿订立合同的权利，任何单位和个人不得非法干预。

　第五条　当事人应当遵循公平原则确定各方的权利和义务。

　第六条　当事人行使权利、履行义务应当遵循诚实信用原则。

　第七条　当事人订立、履行合同，应当遵守法律、行政法规，尊重社会公德，不得扰乱社会经济秩序，损害社会公共利益。

　第八条　依法成立的合同，对当事人具有法律约束力。当事人应当按照约定履行自己的义务，不得擅自变更或者解除合同。
　　依法成立的合同，受法律保护。

　　　　　　　　　　　　 第二章　合同的订立


　第九条　当事人订立合同，应当具有相应的民事权利能力和民事行为能力。
　　当事人依法可以委托代理人订立合同。

　第十条　当事人订立合同，有书面形式、口头形式和其他形式。
　　法律、行政法规规定采用书面形式的，应当采用书面形式。当事人约定采用书面形式的，应当采用书面形式。

　第十一条　书面形式是指合同书、信件和数据电文（包括电报、电传、传真、电子数据交换和电子邮件）等可以有形地表现所载内容的形式。

　第十二条　合同的内容由当事人约定，一般包括以下条款：
　　（一）当事人的名称或者姓名和住所；
　　（二）标的；
　　（三）数量；
　　（四）质量；
　　（五）价款或者报酬；
　　（六）履行期限、地点和方式；
　　（七）违约责任；
　　（八）解决争议的方法。
　　当事人可以参照各类合同的示范文本订立合同。

　第十三条　当事人订立合同，采取要约、承诺方式。

　第十四条　要约是希望和他人订立合同的意思表示，该意思表示应当符合下列规定：
　　（一）内容具体确定；
　　（二）表明经受要约人承诺，要约人即受该意思表示约束。

　第十五条　要约邀请是希望他人向自己发出要约的意思表示。寄送的价目表、拍卖公告、招标公告、招股说明书、商业广告等为要约邀请。
　　商业广告的内容符合要约规定的，视为要约。

　第十六条　要约到达受要约人时生效。
　　采用数据电文形式订立合同，收件人指定特定系统接收数据电文的，该数据电文进入该特定系统的时间，视为到达时间；未指定特定系统的，该数据电文进入收件人的任何系统的首次时间，视为到达时间。

　第十七条　要约可以撤回。撤回要约的通知应当在要约到达受要约人之前或者与要约同时到达受要约人。

　第十八条　要约可以撤销。撤销要约的通知应当在受要约人发出承诺通知之前到达受要约人。

　第十九条　有下列情形之一的，要约不得撤销：
　　（一）要约人确定了承诺期限或者以其他形式明示要约不可撤销；
　　（二）受要约人有理由认为要约是不可撤销的，并已经为履行合同作了准备工作。

　第二十条　有下列情形之一的，要约失效：
　　（一）拒绝要约的通知到达要约人；
　　（二）要约人依法撤销要约；
　　（三）承诺期限届满，受要约人未作出承诺；
　　（四）受要约人对要约的内容作出实质性变更。

　第二十一条　承诺是受要约人同意要约的意思表示。

　第二十二条　承诺应当以通知的方式作出，但根据交易习惯或者要约表明可以通过行为作出承诺的除外。

　第二十三条　承诺应当在要约确定的期限内到达要约人。
　　要约没有确定承诺期限的，承诺应当依照下列规定到达：
　　（一）要约以对话方式作出的，应当即时作出承诺，但当事人另有约定的除外；
　　（二）要约以非对话方式作出的，承诺应当在合理期限内到达。

　第二十四条　要约以信件或者电报作出的，承诺期限自信件载明的日期或者电报交发之日开始计算。信件未载明日期的，自投寄该信件的邮戳日期开始计算。要约以电话、传真等快速通讯方式作出的，承诺期限自要约到达受要约人时开始计算。

　第二十五条　承诺生效时合同成立。

　第二十六条　承诺通知到达要约人时生效。承诺不需要通知的，根据交易习惯或者要约的要求作出承诺的行为时生效。
　　采用数据电文形式订立合同的，承诺到达的时间适用本法第十六条第二款的规定。

　第二十七条　承诺可以撤回。撤回承诺的通知应当在承诺通知到达要约人之前或者与承诺通知同时到达要约人。

　第二十八条　受要约人超过承诺期限发出承诺的，除要约人及时通知受要约人该承诺有效的以外，为新要约。

　第二十九条　受要约人在承诺期限内发出承诺，按照通常情形能够及时到达要约人，但因其他原因承诺到达要约人时超过承诺期限的，除要约人及时通知受要约人因承诺超过期限不接受该承诺的以外，该承诺有效。

　第三十条　承诺的内容应当与要约的内容一致。受要约人对要约的内容作出实质性变更的，为新要约。有关合同标的、数量、质量、价款或者报酬、履行期限、履行地点和方式、违约责任和解决争议方法等的变更，是对要约内容的实质性变更。

　第三十一条　承诺对要约的内容作出非实质性变更的，除要约人及时表示反对或者要约表明承诺不得对要约的内容作出任何变更的以外，该承诺有效，合同的内容以承诺的内容为准。

　第三十二条　当事人采用合同书形式订立合同的，自双方当事人签字或者盖章时合同成立。

　第三十三条　当事人采用信件、数据电文等形式订立合同的，可以在合同成立之前要求签订确认书。签订确认书时合同成立。

　第三十四条　承诺生效的地点为合同成立的地点。
　　采用数据电文形式订立合同的，收件人的主营业地为合同成立的地点；没有主营业地的，其经常居住地为合同成立的地点。当事人另有约定的，按照其约定。

　第三十五条　当事人采用合同书形式订立合同的，双方当事人签字或者盖章的地点为合同成立的地点。

　第三十六条　法律、行政法规规定或者当事人约定采用书面形式订立合同，当事人未采用书面形式但一方已经履行主要义务，对方接受的，该合同成立。

　第三十七条　采用合同书形式订立合同，在签字或者盖章之前，当事人一方已经履行主要义务，对方接受的，该合同成立。

　第三十八条　国家根据需要下达指令性任务或者国家订货任务的，有关法人、其他组织之间应当依照有关法律、行政法规规定的权利和义务订立合同。

　第三十九条　采用格式条款订立合同的，提供格式条款的一方应当遵循公平原则确定当事人之间的权利和义务，并采取合理的方式提请对方注意免除或者限制其责任的条款，按照对方的要求，对该条款予以说明。
　　格式条款是当事人为了重复使用而预先拟定，并在订立合同时未与对方协商的条款。

　第四十条　格式条款具有本法第五十二条和第五十三条规定情形的，或者提供格式条款一方免除其责任、加重对方责任、排除对方主要权利的，该条款无效。

　第四十一条　对格式条款的理解发生争议的，应当按通常理解予以解释。对格式条款有两种以上解释的，应当作出不利于提供格式条款一方的解释。格式条款和非格条　式款不一致的，应当采用非格式条款。

　第四十二条　当事人在订立合同过程中有下列情形之一，给对方造成损失的，应当承担损害赔偿责任：
　　（一）假借订立合同，恶意进行磋商；
　　（二）故意隐瞒与订立合同有关的重要事实或者提供虚假情况；
　　（三）有其他违背诚实信用原则的行为。

　第四十三条　当事人在订立合同过程中知悉的商业秘密，无论合同是否成立，不得泄露或者不正当地使用。泄露或者不正当地使用该商业秘密给对方造成损失的，应当承担损害赔偿责任。

　　　　　　　　　　　　 第三章　合同的效力


　第四十四条　依法成立的合同，自成立时生效。
　　法律、行政法规规定应当办理批准、登记等手续生效的，依照其规定。

　第四十五条　当事人对合同的效力可以约定附条件。附生效条件的合同，自条件成就时生效。附解除条件的合同，自条件成就时失效。
　　当事人为自己的利益不正当地阻止条件成就的，视为条件已成就；不正当地促成条件成就的，视为条件不成就。

　第四十六条　当事人对合同的效力可以约定附期限。附生效期限的合同，自期限届至时生效。附终止期限的合同，自期限届满时失效。

　第四十七条　限制民事行为能力人订立的合同，经法定代理人追认后，该合同有效，但纯获利益的合同或者与其年龄、智力、精神健康状况相适应而订立的合同，不必经法定代理人追认。
　　相对人可以催告法定代理人在一个月内予以追认。法定代理人未作表示的，视为拒绝追认。合同被追认之前，善意相对人有撤销的权利。撤销应当以通知的方式作出。

　第四十八条　行为人没有代理权、超越代理权或者代理权终止后以被代理人名义订立的合同，未经被代理人追认，对被代理人不发生效力，由行为人承担责任。
　　相对人可以催告被代理人在一个月内予以追认。被代理人未作表示的，视为拒绝追认。合同被追认之前，善意相对人有撤销的权利。撤销应当以通知的方式作出。

　第四十九条　行为人没有代理权、超越代理权或者代理权终止后以被代理人名义订立合同，相对人有理由相信行为人有代理权的，该代理行为有效。

　第五十条　法人或者其他组织的法定代表人、负责人超越权限订立的合同，除相对人知道或者应当知道其超越权限的以外，该代表行为有效。

　第五十一条　无处分权的人处分他人财产，经权利人追认或者无处分权的人订立合同后取得处分权的，该合同有效。

　第五十二条　有下列情形之一的，合同无效：
　　（一）一方以欺诈、胁迫的手段订立合同，损害国家利益；
　　（二）恶意串通，损害国家、集体或者第三人利益；
　　（三）以合法形式掩盖非法目的；
　　（四）损害社会公共利益；
　　（五）违反法律、行政法规的强制性规定。

　第五十三条　合同中的下列免责条款无效：
　　（一）造成对方人身伤害的；
　　（二）因故意或者重大过失造成对方财产损失的。

　第五十四条　下列合同，当事人一方有权请求人民法院或者仲裁机构变更或者撤销：
　　（一）因重大误解订立的；
　　（二）在订立合同时显失公平的。
　　一方以欺诈、胁迫的手段或者乘人之危，使对方在违背真实意思的情况下订立的合同，受损害方有权请求人民法院或者仲裁机构变更或者撤销。
　　当事人请求变更的，人民法院或者仲裁机构不得撤销。

　第五十五条　有下列情形之一的，撤销权消灭：
　　（一）具有撤销权的当事人自知道或者应当知道撤销事由之日起一年内没有行使撤销权；
　　（二）具有撤销权的当事人知道撤销事由后明确表示或者以自己的行为放弃撤销权。

　第五十六条　无效的合同或者被撤销的合同自始没有法律约束力。合同部分无效，不影响其他部分效力的，其他部分仍然有效。

　第五十七条　合同无效、被撤销或者终止的，不影响合同中独立存在的有关解决争议方法的条款的效力。

　第五十八条　合同无效或者被撤销后，因该合同取得的财产，应当予以返还；不能返还或者没有必要返还的，应当折价补偿。有过错的一方应当赔偿对方因此所受到的损失，双方都有过错的，应当各自承担相应的责任。

　第五十九条　当事人恶意串通，损害国家、集体或者第三人利益的，因此取得的财产收归国家所有或者返还集体、第三人。

　　　　　　　　　　　　 第四章　合同的履行


　第六十条　当事人应当按照约定全面履行自己的义务。
　　当事人应当遵循诚实信用原则，根据合同的性质、目的和交易习惯履行通知、协助、保密等义务。

　第六十一条　合同生效后，当事人就质量、价款或者报酬、履行地点等内容没有约定或者约定不明确的，可以协议补充；不能达成补充协议的，按照合同有关条款或者交易习惯确定。

　第六十二条　当事人就有关合同内容约定不明确，依照本法第六十一条　的规定仍不能确定的，适用下列规定：
　　（一）质量要求不明确的，按照国家标准、行业标准履行；没有国家标准、行业标准的，按照通常标准或者符合合同目的的特定标准履行。
　　（二）价款或者报酬不明确的，按照订立合同时履行地的市场价格履行；依法应当执行政府定价或者政府指导价的，按照规定履行。
　　（三）履行地点不明确，给付货币的，在接受货币一方所在地履行；交付不动产的，在不动产所在地履行；其他标的，在履行义务一方所在地履行。
　　（四）履行期限不明确的，债务人可以随时履行，债权人也可以随时要求履行，但应当给对方必要的准备时间。
　　（五）履行方式不明确的，按照有利于实现合同目的的方式履行。
　　（六）履行费用的负担不明确的，由履行义务一方负担。

　第六十三条　执行政府定价或者政府指导价的，在合同约定的交付期限内政府价格调整时，按照交付时的价格计价。逾期交付标的物的，遇价格上涨时，按照原价格执行；价格下降时，按照新价格执行。逾期提取标的物或者逾期付款的，遇价格上涨时，按照新价格执行；价格下降时，按照原价格执行。

　第六十四条　当事人约定由债务人向第三人履行债务的，债务人未向第三人履行债务或者履行债务不符合约定，应当向债权人承担违约责任。

　第六十五条　当事人约定由第三人向债权人履行债务的，第三人不履行债务或者履行债务不符合约定，债务人应当向债权人承担违约责任。

　第六十六条　当事人互负债务，没有先后履行顺序的，应当同时履行。一方在对方履行之前有权拒绝其履行要求。一方在对方履行债务不符合约定时，有权拒绝其相应的履行要求。

　第六十七条　当事人互负债务，有先后履行顺序，先履行一方未履行的，后履行一方有权拒绝其履行要求。先履行一方履行债务不符合约定的，后履行一方有权拒绝其相应的履行要求。

　第六十八条　应当先履行债务的当事人，有确切证据证明对方有下列情形之一的，可以中止履行：
　　（一）经营状况严重恶化；
　　（二）转移财产、抽逃资金，以逃避债务；
　　（三）丧失商业信誉；
　　（四）有丧失或者可能丧失履行债务能力的其他情形。
　　当事人没有确切证据中止履行的，应当承担违约责任。

　第六十九条　当事人依照本法第六十八条的规定中止履行的，应当及时通知对方。对方提供适当担保时，应当恢复履行。中止履行后，对方在合理期限内未恢复履行能力并且未提供适当担保的，中止履行的一方可以解除合同。

　第七十条　债权人分立、合并或者变更住所没有通知债务人，致使履行债务发生困难的，债务人可以中止履行或者将标的物提存。

　第七十一条　债权人可以拒绝债务人提前履行债务，但提前履行不损害债权人利益的除外。
　　债务人提前履行债务给债权人增加的费用，由债务人负担。

　第七十二条　债权人可以拒绝债务人部分履行债务，但部分履行不损害债权人利益的除外。
　　债务人部分履行债务给债权人增加的费用，由债务人负担。

　第七十三条　因债务人怠于行使其到期债权，对债权人造成损害的，债权人可以向人民法院请求以自己的名义代位行使债务人的债权，但该债权专属于债务人自身的除外。
　　代位权的行使范围以债权人的债权为限。债权人行使代位权的必要费用，由债务人负担。

　第七十四条　因债务人放弃其到期债权或者无偿转让财产，对债权人造成损害的，债权人可以请求人民法院撤销债务人的行为。债务人以明显不合理的低价转让财产，对债权人造成损害，并且受让人知道该情形的，债权人也可以请求人民法院撤销债务人的行为。
　　撤销权的行使范围以债权人的债权为限。债权人行使撤销权的必要费用，由债务人负担。

　第七十五条　撤销权自债权人知道或者应当知道撤销事由之日起一年内行使。自债务人的行为发生之日起五年内没有行使撤销权的，该撤销权消灭。

　第七十六条　合同生效后，当事人不得因姓名、名称的变更或者法定代表人、负责人、承办人的变动而不履行合同义务。

　　　　　　　　　　　第五章　合同的变更和转让


　第七十七条　当事人协商一致，可以变更合同。
　　法律、行政法规规定变更合同应当办理批准、登记等手续的，依照其规定。

　第七十八条　当事人对合同变更的内容约定不明确的，推定为未变更。

　第七十九条　债权人可以将合同的权利全部或者部分转让给第三人，但有下列情形之一的除外：
　　（一）根据合同性质不得转让；
　　（二）按照当事人约定不得转让；
　　（三）依照法律规定不得转让。

　第八十条　债权人转让权利的，应当通知债务人。未经通知，该转让对债务人不发生效力。
　　债权人转让权利的通知不得撤销，但经受让人同意的除外。

　第八十一条　债权人转让权利的，受让人取得与债权有关的从权利，但该从权利专属于债权人自身的除外。

　第八十二条　债务人接到债权转让通知后，债务人对让与人的抗辩，可以向受让人主张。

　第八十三条　债务人接到债权转让通知时，债务人对让与人享有债权，并且债务人的债权先于转让的债权到期或者同时到期的，债务人可以向受让人主张抵销。

　第八十四条　债务人将合同的义务全部或者部分转移给第三人的，应当经债权人同意。

　第八十五条　债务人转移义务的，新债务人可以主张原债务人对债权人的抗辩。

　第八十六条　债务人转移义务的，新债务人应当承担与主债务有关的从债务，但该从债务专属于原债务人自身的除外。

　第八十七条　法律、行政法规规定转让权利或者转移义务应当办理批准、登记等手续的，依照其规定。

　第八十八条　当事人一方经对方同意，可以将自己在合同中的权利和义务一并转让给第三人。

　第八十九条　权利和义务一并转让的，适用本法第七十九条、第八十一条至第八十三条、第八十五条至第八十七条的规定。

　第九十条　当事人订立合同后合并的，由合并后的法人或者其他组织行使合同权利，履行合同义务。当事人订立合同后分立的，除债权人和债务人另有约定的以外，由分立的法人或者其他组织对合同的权利和义务享有连带债权，承担连带债务。

　　　　　　　　　　 第六章　合同的权利义务终止


　第九十一条　有下列情形之一的，合同的权利义务终止：
　　（一）债务已经按照约定履行；
　　（二）合同解除；
　　（三）债务相互抵销；
　　（四）债务人依法将标的物提存；
　　（五）债权人免除债务；
　　（六）债权债务同归于一人；
　　（七）法律规定或者当事人约定终止的其他情形。

　第九十二条　合同的权利义务终止后，当事人应当遵循诚实信用原则，根据交易习惯履行通知、协助、保密等义务。

　第九十三条　当事人协商一致，可以解除合同。
　　当事人可以约定一方解除合同的条件。解除合同的条件成就时，解除权人可以解除合同。

　第九十四条　有下列情形之一的，当事人可以解除合同：
　　（一）因不可抗力致使不能实现合同目的；
　　（二）在履行期限届满之前，当事人一方明确表示或者以自己的行为表明不履行主要债务；
　　（三）当事人一方迟延履行主要债务，经催告后在合理期限内仍未履行；
　　（四）当事人一方迟延履行债务或者有其他违约行为致使不能实现合同目的；
　　（五）法律规定的其他情形。

　第九十五条　法律规定或者当事人约定解除权行使期限，期限届满当事人不行使的，该权利消灭。
　　法律没有规定或者当事人没有约定解除权行使期限，经对方催告后在合理期限内不行使的，该权利消灭。

　第九十六条　当事人一方依照本法第九十三条第二款、第九十四条的规定主张解除合同的，应当通知对方。合同自通知到达对方时解除。对方有异议的，可以请求人民法 院或者仲裁机构确认解除合同的效力。
　　法律、行政法规规定解除合同应当办理批准、登记等手续的，依照其规定。

　第九十七条　合同解除后，尚未履行的，终止履行；已经履行的，根据履行情况和合同性质，当事人可以要求恢复原状、采取其他补救措施，并有权要求赔偿损失。

　第九十八条　合同的权利义务终止，不影响合同中结算和清理条款的效力。

　第九十九条　当事人互负到期债务，该债务的标的物种类、品质相同的，任何一方可以将自己的债务与对方的债务抵销，但依照法律规定或者按照合同性质不得抵销的除外。
　　当事人主张抵销的，应当通知对方。通知自到达对方时生效。抵销不得附条件或者附期限。

　第一百条　当事人互负债务，标的物种类、品质不相同的，经双方协商一致，也可以抵销。

　第一百零一条　有下列情形之一，难以履行债务的，债务人可以将标的物提存：
　　（一）债权人无正当理由拒绝受领；
　　（二）债权人下落不明；
　　（三）债权人死亡未确定继承人或者丧失民事行为能力未确定监护人；
　　（四）法律规定的其他情形。
　　标的物不适于提存或者提存费用过高的，债务人依法可以拍卖或者变卖标的物，提存所得的价款。

　第一百零二条　标的物提存后，除债权人下落不明的以外，债务人应当及时通知债权人或者债权人的继承人、监护人。

　第一百零三条　标的物提存后，毁损、灭失的风险由债权人承担。提存期间，标的物的孳息归债权人所有。提存费用由债权人负担。

　第一百零四条　债权人可以随时领取提存物，但债权人对债务人负有到期债务的，在债权人未履行债务或者提供担保之前，提存部门根据债务人的要求应当拒绝其领取提存物。
　　债权人领取提存物的权利，自提存之日起五年内不行使而消灭，提存物扣除提存费用后归国家所有。

　第一百零五条　债权人免除债务人部分或者全部债务的，合同的权利义务部分或者全部终止。

　第一百零六条　债权和债务同归于一人的，合同的权利义务终止，但涉及第三人利益的除外。

　　　　　　　　　　　　　第七章　违约责任


　第一百零七条　当事人一方不履行合同义务或者履行合同义务不符合约定的，应当承担继续履行、采取补救措施或者赔偿损失等违约责任。

　第一百零八条　当事人一方明确表示或者以自己的行为表明不履行合同义务的，对方可以在履行期限届满之前要求其承担违约责任。

　第一百零九条　当事人一方未支付价款或者报酬的，对方可以要求其支付价款或者报酬。

　第一百一十条　当事人一方不履行非金钱债务或者履行非金钱债务不符合约定的，对方可以要求履行，但有下列情形之一的除外：
　　（一）法律上或者事实上不能履行；
　　（二）债务的标的不适于强制履行或者履行费用过高；
　　（三）债权人在合理期限内未要求履行。

　第一百一十一条　质量不符合约定的，应当按照当事人的约定承担违约责任。对违约责任没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，受损害方根据标的的性质以及损失的大小，可以合理选择要求对方承担修理、更换、重作、退货、减少价款或者报酬等违约责任。

　第一百一十二条　当事人一方不履行合同义务或者履行合同义务不符合约定的，在履行义务或者采取补救措施后，对方还有其他损失的，应当赔偿损失。

　第一百一十三条　当事人一方不履行合同义务或者履行合同义务不符合约定，给对方造成损失的，损失赔偿额应当相当于因违约所造成的损失，包括合同履行后可以获得的利益，但不得超过违反合同一方订立合同时预见到或者应当预见到的因违反合同可能造成的损失。
　　经营者对消费者提供商品或者服务有欺诈行为的，依照《中华人民共和国消费者权益保护法》的规定承担损害赔偿责任。

　第一百一十四条　当事人可以约定一方违约时应当根据违约情况向对方支付一定数额的违约金，也可以约定因违约产生的损失赔偿额的计算方法。
　　约定的违约金低于造成的损失的，当事人可以请求人民法院或者仲裁机构予以增加；约定的违约金过分高于造成的损失的，当事人可以请求人民法院或者仲裁机构予以适当减少。
　　当事人就迟延履行约定违约金的，违约方支付违约金后，还应当履行债务。

　第一百一十五条　当事人可以依照《中华人民共和国担保法》约定一方向对方给付定金作为债权的担保。债务人履行债务后，定金应当抵作价款或者收回。给付定金的一方不履行约定的债务的，无权要求返还定金；收受定金的一方不履行约定的债务的，应当双倍返还定金。

　第一百一十六条　当事人既约定违约金，又约定定金的，一方违约时，对方可以选择适用违约金或者定金条款。

　第一百一十七条　因不可抗力不能履行合同的，根据不可抗力的影响，部分或者全部免除责任，但法律另有规定的除外。当事人迟延履行后发生不可抗力的，不能免除责任。
　　本法所称不可抗力，是指不能预见、不能避免并不能克服的客观情况。

　第一百一十八条　当事人一方因不可抗力不能履行合同的，应当及时通知对方，以减轻可能给对方造成的损失，并应当在合理期限内提供证明。

　第一百一十九条　当事人一方违约后，对方应当采取适当措施防止损失的扩大；没有采取适当措施致使损失扩大的，不得就扩大的损失要求赔偿。
　　当事人因防止损失扩大而支出的合理费用，由违约方承担。

　第一百二十条　当事人双方都违反合同的，应当各自承担相应的责任。

　第一百二十一条　当事人一方因第三人的原因造成违约的，应当向对方承担违约责任。当事人一方和第三人之间的纠纷，依照法律规定或者按照约定解决。

　第一百二十二条　因当事人一方的违约行为，侵害对方人身、财产权益的，受损害方有权选择依照本法要求其承担违约责任或者依照其他法律要求其承担侵权责任。

　　　　　　　　　　　　　第八章　其他规定


　第一百二十三条　其他法律对合同另有规定的，依照其规定。

　第一百二十四条　本法分则或者其他法律没有明文规定的合同，适用本法总则的规定，并可以参照本法分则或者其他法律最相类似的规定。

　第一百二十五条　当事人对合同条款的理解有争议的，应当按照合同所使用的词句、合同的有关条款、合同的目的、交易习惯以及诚实信用原则，确定该条款的真实意思。
　　合同文本采用两种以上文字订立并约定具有同等效力的，对各文本使用的词句推定具有相同含义。各文本使用的词句不一致的，应当根据合同的目的予以解释。

　第一百二十六条　涉外合同的当事人可以选择处理合同争议所适用的法律，但法律另有规定的除外。涉外合同的当事人没有选择的，适用与合同有最密切联系的国家的法律。
　　在中华人民共和国境内履行的中外合资经营企业合同、中外合作经营企业合同、中外合作勘探开发自然资源合同，适用中华人民共和国法律。

　第一百二十七条　工商行政管理部门和其他有关行政主管部门在各自的职权范围内，依照法律、行政法规的规定，对利用合同危害国家利益、社会公共利益的违法行为，负责监督处理；构成犯罪的，依法追究刑事责任。

　第一百二十八条　当事人可以通过和解或者调解解决合同争议。
　　当事人不愿和解、调解或者和解、调解不成的，可以根据仲裁协议向仲裁机构申请仲裁。涉外合同的当事人可以根据仲裁协议向中国仲裁机构或者其他仲裁机构申请仲裁。当事人没有订立仲裁协议或者仲裁协议无效的，可以向人民法院起诉。当事人应当履行发生法律效力的判决、仲裁裁决、调解书；拒不履行的，对方可以请求人民法院执行。

　第一百二十九条　因国际货物买卖合同和技术进出口合同争议提起诉讼或者申请仲裁的期限为四年，自当事人知道或者应当知道其权利受到侵害之日起计算。因其他合同争议提起诉讼或者申请仲裁的期限，依照有关法律的规定。

　　　　　　　　　　　　　　　　分则


　　　　　　　　　　　　　第九章　买卖合同


　第一百三十条　买卖合同是出卖人转移标的物的所有权于买受人，买受人支付价款的合同。

　第一百三十一条　买卖合同的内容除依照本法第十二条的规定以外，还可以包括包装方式、检验标准和方法、结算方式、合同使用的文字及其效力等条款。

　第一百三十二条　出卖的标的物，应当属于出卖人所有或者出卖人有权处分。
　　法律、行政法规禁止或者限制转让的标的物，依照其规定。

　第一百三十三条　标的物的所有权自标的物交付时起转移，但法律另有规定或者当事人另有约定的除外。

　第一百三十四条　当事人可以在买卖合同中约定买受人未履行支付价款或者其他义务的，标的物的所有权属于出卖人。

　第一百三十五条　出卖人应当履行向买受人交付标的物或者交付提取标的物的单证，并转移标的物所有权的义务。

　第一百三十六条　出卖人应当按照约定或者交易习惯向买受人交付提取标的物单证以外的有关单证和资料。

　第一百三十七条　出卖具有知识产权的计算机软件等标的物的，除法律另有规定或者当事人另有约定的以外，该标的物的知识产权不属于买受人。

　第一百三十八条　出卖人应当按照约定的期限交付标的物。约定交付期间的，出卖人可以在该交付期间内的任何时间交付。

　第一百三十九条　当事人没有约定标的物的交付期限或者约定不明确的，适用本法第六十一条、第六十二条第四项的规定。

　第一百四十条　标的物在订立合同之前已为买受人占有的，合同生效的时间为交付时间。

　第一百四十一条　出卖人应当按照约定的地点交付标的物。
　　当事人没有约定交付地点或者约定不明确，依照本法第六十一条的规定仍不能确定的，适用下列规定：
　　（一）标的物需要运输的，出卖人应当将标的物交付给第一承运人以运交给买受人；
　　（二）标的物不需要运输，出卖人和买受人订立合同时知道标的物在某一地点的，出卖人应当在该地点交付标的物；不知道标的物在某一地点的，应当在出卖人订立合同时的营业地交付标的物。

　第一百四十二条　标的物毁损、灭失的风险，在标的物交付之前由出卖人承担，交付之后由买受人承担，但法律另有规定或者当事人另有约定的除外。

　第一百四十三条　因买受人的原因致使标的物不能按照约定的期限交付的，买受人应当自违反约定之日起承担标的物毁损、灭失的风险。

　第一百四十四条　出卖人出卖交由承运人运输的在途标的物，除当事人另有约定的以外，毁损、灭失的风险自合同成立时起由买受人承担。

　第一百四十五条　当事人没有约定交付地点或者约定不明确，依照本法第一百四十一条第二款第一项的规定标的物需要运输的，出卖人将标的物交付给第一承运人后，标的物毁损、灭失的风险由买受人承担。

　第一百四十六条　出卖人按照约定或者依照本法第一百四十一条第二款第二项的规定将标的物置于交付地点，买受人违反约定没有收取的，标的物毁损、灭失的风险自违反约定之日起由买受人承担。

　第一百四十七条　出卖人按照约定未交付有关标的物的单证和资料的，不影响标的物毁损、灭失风险的转移。

　第一百四十八条　因标的物质量不符合质量要求，致使不能实现合同目的的，买受人可以拒绝接受标的物或者解除合同。买受人拒绝接受标的物或者解除合同的，标的物毁损、灭失的风险由出卖人承担。

　第一百四十九条　标的物毁损、灭失的风险由买受人承担的，不影响因出卖人履行债务不符合约定，买受人要求其承担违约责任的权利。

　第一百五十条　出卖人就交付的标的物，负有保证第三人不得向买受人主张任何权利的义务，但法律另有规定的除外。

　第一百五十一条　买受人订立合同时知道或者应当知道第三人对买卖的标的物享有权利的，出卖人不承担本法第一百五十条规定的义务。

　第一百五十二条　买受人有确切证据证明第三人可能就标的物主张权利的，可以中止支付相应的价款，但出卖人提供适当担保的除外。

　第一百五十三条　出卖人应当按照约定的质量要求交付标的物。出卖人提供有关标的物质量说明的，交付的标的物应当符合该说明的质量要求。

　第一百五十四条　当事人对标的物的质量要求没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，适用本法第六十二条第一项的规定。

　第一百五十五条　出卖人交付的标的物不符合质量要求的，买受人可以依照本法第一百一十一条的规定要求承担违约责任。

　第一百五十六条　出卖人应当按照约定的包装方式交付标的物。对包装方式没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，应当按照通用的方式包装，没有通用方式的，应当采取足以保护标的物的包装方式。

　第一百五十七条　买受人收到标的物时应当在约定的检验期间内检验。没有约定检验期间的，应当及时检验。

　第一百五十八条　当事人约定检验期间的，买受人应当在检验期间内将标的物的数量或者质量不符合约定的情形通知出卖人。买受人怠于通知的，视为标的物的数量或者质量符合约定。
　　当事人没有约定检验期间的，买受人应当在发现或者应当发现标的物的数量或者质量不符合约定的合理期间内通知出卖人。买受人在合理期间内未通知或者自标的物收到之日起两年内未通知出卖人的，视为标的物的数量或者质量符合约定，但对标的物有质量保证期的，适用质量保证期，不适用该两年的规定。
　　出卖人知道或者应当知道提供的标的物不符合约定的，买受人不受前两款规定的通知时间的限制。

　第一百五十九条　买受人应当按照约定的数额支付价款。对价款没有约定或者约定不明确的，适用本法第六十一条、第六十二条第二项的规定。

　第一百六十条　买受人应当按照约定的地点支付价款。对支付地点没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，买受人应当在出卖人的营业地支付，但约定支付价款以交付标的物或者交付提取标的物单证为条件的，在交付标的物或者交付提取标的物单证的所在地支付。

　第一百六十一条　买受人应当按照约定的时间支付价款。对支付时间没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，买受人应当在收到标的物或者提取标的物单证的同时支付。

　第一百六十二条　出卖人多交标的物的，买受人可以接收或者拒绝接收多交的部分。买受人接收多交部分的，按照合同的价格支付价款；买受人拒绝接收多交部分的，应当及时通知出卖人。

　第一百六十三条　标的物在交付之前产生的孳息，归出卖人所有，交付之后产生的孳息，归买受人所有。

　第一百六十四条　因标的物的主物不符合约定而解除合同的，解除合同的效力及于从物。因标的物的从物不符合约定被解除的，解除的效力不及于主物。

　第一百六十五条　标的物为数物，其中一物不符合约定的，买受人可以就该物解除，但该物与他物分离使标的物的价值显受损害的，当事人可以就数物解除合同。

　第一百六十六条　出卖人分批交付标的物的，出卖人对其中一批标的物不交付或者交付不符合约定，致使该批标的物不能实现合同目的的，买受人可以就该批标的物解除。
　　出卖人不交付其中一批标的物或者交付不符合约定，致使今后其他各批标的物的交付不能实现合同目的的，买受人可以就该批以及今后其他各批标的物解除。
　　买受人如果就其中一批标的物解除，该批标的物与其他各批标的物相互依存的，可以就已经交付和未交付的各批标的物解除。

　第一百六十七条　分期付款的买受人未支付到期价款的金额达到全部价款的五分之一的，出卖人可以要求买受人支付全部价款或者解除合同。
　　出卖人解除合同的，可以向买受人要求支付该标的物的使用费。

　第一百六十八条　凭样品买卖的当事人应当封存样品，并可以对样品质量予以说明。出卖人交付的标的物应当与样品及其说明的质量相同。

　第一百六十九条　凭样品买卖的买受人不知道样品有隐蔽瑕疵的，即使交付的标的物与样品相同，出卖人交付的标的物的质量仍然应当符合同种物的通常标准。

　第一百七十条　试用买卖的当事人可以约定标的物的试用期间。对试用期间没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，由出卖人确定。

　第一百七十一条　试用买卖的买受人在试用期内可以购买标的物，也可以拒绝购买。试用期间届满，买受人对是否购买标的物未作表示的，视为购买。

　第一百七十二条　招标投标买卖的当事人的权利和义务以及招标投标程序等，依照有关法律、行政法规的规定。

　第一百七十三条　拍卖的当事人的权利和义务以及拍卖程序等，依照有关法律、行政法规的规定。

　第一百七十四条　法律对其他有偿合同有规定的，依照其规定；没有规定的，参照买卖合同的有关规定。

　第一百七十五条　当事人约定易货交易，转移标的物的所有权的，参照买卖合同的有关规定。

　　　　　　　　　第十章　供用电、水、气、热力合同


　第一百七十六条　供用电合同是供电人向用电人供电，用电人支付电费的合同。

　第一百七十七条　供用电合同的内容包括供电的方式、质量、时间，用电容量、地址、性质，计量方式，电价、电费的结算方式，供用电设施的维护责任等条款。

　第一百七十八条　供用电合同的履行地点，按照当事人约定；当事人没有约定或者约定不明确的，供电设施的产权分界处为履行地点。

　第一百七十九条　供电人应当按照国家规定的供电质量标准和约定安全供电。供电人未按照国家规定的供电质量标准和约定安全供电，造成用电人损失的，应当承担损害赔偿责任。

　第一百八十条　供电人因供电设施计划检修、临时检修、依法限电或者用电人违法用电等原因，需要中断供电时，应当按照国家有关规定事先通知用电人。未事先通知用电人中断供电，造成用电人损失的，应当承担损害赔偿责任。

　第一百八十一条　因自然灾害等原因断电，供电人应当按照国家有关规定及时抢修。未及时抢修，造成用电人损失的，应当承担损害赔偿责任。

　第一百八十二条　用电人应当按照国家有关规定和当事人的约定及时交付电费。用电人逾期不交付电费的，应当按照约定支付违约金。经催告用电人在合理期限内仍不交付电费和违约金的，供电人可以按照国家规定的程序中止供电。

　第一百八十三条　用电人应当按照国家有关规定和当事人的约定安全用电。用电人未按照国家有关规定和当事人的约定安全用电，造成供电人损失的，应当承担损害赔偿责任。

　第一百八十四条　供用水、供用气、供用热力合同，参照供用电合同的有关规定。

　　　　　　　　　　　　 第十一章　赠与合同


　第一百八十五条　赠与合同是赠与人将自己的财产无偿给予受赠人，受赠人表示接受赠与的合同。

　第一百八十六条　赠与人在赠与财产的权利转移之前可以撤销赠与。
　　具有救灾、扶贫等社会公益、道德义务性质的赠与合同或者经过公证的赠与合同，不适用前款规定。

　第一百八十七条　赠与的财产依法需要办理登记等手续的，应当办理有关手续。

　第一百八十八条　具有救灾、扶贫等社会公益、道德义务性质的赠与合同或者经过公证的赠与合同，赠与人不交付赠与的财产的，受赠人可以要求交付。

　第一百八十九条　因赠与人故意或者重大过失致使赠与的财产毁损、灭失的，赠与人应当承担损害赔偿责任。

　第一百九十条　赠与可以附义务。
　　赠与附义务的，受赠人应当按照约定履行义务。

　第一百九十一条　赠与的财产有瑕疵的，赠与人不承担责任。附义务的赠与，赠与的财产有瑕疵的，赠与人在附义务的限度内承担与出卖人相同的责任。
　　赠与人故意不告知瑕疵或者保证无瑕疵，造成受赠人损失的，应当承担损害赔偿责任。

　第一百九十二条　受赠人有下列情形之一的，赠与人可以撤销赠与：
　　（一）严重侵害赠与人或者赠与人的近亲属；
　　（二）对赠与人有扶养义务而不履行；
　　（三）不履行赠与合同约定的义务。
　　赠与人的撤销权，自知道或者应当知道撤销原因之日起一年内行使。

　第一百九十三条　因受赠人的违法行为致使赠与人死亡或者丧失民事行为能力的，赠与人的继承人或者法定代理人可以撤销赠与。
　　赠与人的继承人或者法定代理人的撤销权，自知道或者应当知道撤销原因之日起六个月内行使。

　第一百九十四条　撤销权人撤销赠与的，可以向受赠人要求返还赠与的财产。

　第一百九十五条　赠与人的经济状况显著恶化，严重影响其生产经营或者家庭生活的，可以不再履行赠与义务。

　　　　　　　　　　　　 第十二章　借款合同


　第一百九十六条　借款合同是借款人向贷款人借款，到期返还借款并支付利息的合同。

　第一百九十七条　借款合同采用书面形式，但自然人之间借款另有约定的除外。
　　借款合同的内容包括借款种类、币种、用途、数额、利率、期限和还款方式等条款。

　第一百九十八条　订立借款合同，贷款人可以要求借款人提供担保。担保依照《中华人民共和国担保法》的规定。

　第一百九十九条　订立借款合同，借款人应当按照贷款人的要求提供与借款有关的业务活动和财务状况的真实情况。

　第二百条　借款的利息不得预先在本金中扣除。利息预先在本金中扣除的，应当按照实际借款数额返还借款并计算利息。

　第二百零一条　贷款人未按照约定的日期、数额提供借款，造成借款人损失的，应当赔偿损失。
　　借款人未按照约定的日期、数额收取借款的，应当按照约定的日期、数额支付利息。

　第二百零二条　贷款人按照约定可以检查、监督借款的使用情况。借款人应当按照约定向贷款人定期提供有关财务会计报表等资料。

　第二百零三条　借款人未按照约定的借款用途使用借款的，贷款人可以停止发放借款、提前收回借款或者解除合同。

　第二百零四条　办理贷款业务的金融机构贷款的利率，应当按照中国人民银行规定的贷款利率的上下限确定。

　第二百零五条　借款人应当按照约定的期限支付利息。对支付利息的期限没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定，借款期间不满一年的，应当在返还借款时一并支付；借款期间一年以上的，应当在每届满一年时支付，剩余期间不满一年的，应当在返还借款时一并支付。

　第二百零六条　借款人应当按照约定的期限返还借款。对借款期限没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，借款人可以随时返还；贷款人可以催告借款人在合理期限内返还。

　第二百零七条　借款人未按照约定的期限返还借款的，应当按照约定或者国家有关规定支付逾期利息。

　第二百零八条　借款人提前偿还借款的，除当事人另有约定的以外，应当按照实际借款的期间计算利息。

　第二百零九条　借款人可以在还款期限届满之前向贷款人申请展期。贷款人同意的，可以展期。

　第二百一十条　自然人之间的借款合同，自贷款人提供借款时生效。

　第二百一十一条　自然人之间的借款合同对支付利息没有约定或者约定不明确的，视为不支付利息。自然人之间的借款合同约定支付利息的，借款的利率不得违反国家有关限制借款利率的规定。

　　　　　　　　　　　　 第十三章　租赁合同


　第二百一十二条　租赁合同是出租人将租赁物交付承租人使用、收益，承租人支付租金的合同。

　第二百一十三条　租赁合同的内容包括租赁物的名称、数量、用途、租赁期限、租金及其支付期限和方式、租赁物维修等条款。

　第二百一十四条　租赁期限不得超过二十年。超过二十年的，超过部分无效。
　　租赁期间届满，当事人可以续订租赁合同，但约定的租赁期限自续订之日起不得超过二十年。

　第二百一十五条　租赁期限六个月以上的，应当采用书面形式。当事人未采用书面形式的，视为不定期租赁。

　第二百一十六条　出租人应当按照约定将租赁物交付承租人，并在租赁期间保持租赁物符合约定的用途。

　第二百一十七条　承租人应当按照约定的方法使用租赁物。对租赁物的使用方法没有约定或者约定不明确，依照本法第六十一条　的规定仍不能确定的，应当按照租赁物的性质使用。

　第二百一十八条　承租人按照约定的方法或者租赁物的性质使用租赁物，致使租赁物受到损耗的，不承担损害赔偿责任。

　第二百一十九条　承租人未按照约定的方法或者租赁物的性质使用租赁物，致使租赁物受到损失的，出租人可以解除合同并要求赔偿损失。

　第二百二十条　出租人应当履行租赁物的维修义务，但当事人另有约定的除外。

　第二百二十一条　承租人在租赁物需要维修时可以要求出租人在合理期限内维修。出租人未履行维修义务的，承租人可以自行维修，维修费用由出租人负担。因维修租赁物影响承租人使用的，应当相应减少租金或者延长租期。

　第二百二十二条　承租人应当妥善保管租赁物，因保管不善造成租赁物毁损、灭失的，应当承担损害赔偿责任。

　第二百二十三条　承租人经出租人同意，可以对租赁物进行改善或者增设他物。
　　承租人未经出租人同意，对租赁物进行改善或者增设他物的，出租人可以要求承租人恢复原状或者赔偿损失。

　第二百二十四条　承租人经出租人同意，可以将租赁物转租给第三人。承租人转租的，承租人与出租人之间的租赁合同继续有效，第三人对租赁物造成损失的，承租人应当赔偿损失。
　　承租人未经出租人同意转租的，出租人可以解除合同。

　第二百二十五条　在租赁期间因占有、使用租赁物获得的收益，归承租人所有，但当事人另有约定的除外。

　第二百二十六条　承租人应当按照约定的期限支付租金。对支付期限没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定，租赁期间不满一年的，应当在租赁期间届满时支付；租赁期间一年以上的，应当在每届满一年时支付，剩余期间不满一年的，应当在租赁期间届满时支付。

　第二百二十七条　承租人无正当理由未支付或者迟延支付租金的，出租人可以要求承租人在合理期限内支付。承租人逾期不支付的，出租人可以解除合同。

　第二百二十八条　因第三人主张权利，致使承租人不能对租赁物使用、收益的，承租人可以要求减少租金或者不支付租金。
　　第三人主张权利的，承租人应当及时通知出租人。

　第二百二十九条　租赁物在租赁期间发生所有权变动的，不影响租赁合同的效力。

　第二百三十条　出租人出卖租赁房屋的，应当在出卖之前的合理期限内通知承租人，承租人享有以同等条件优先购买的权利。

　第二百三十一条　因不可归责于承租人的事由，致使租赁物部分或者全部毁损、灭失的，承租人可以要求减少租金或者不支付租金；因租赁物部分或者全部毁损、灭失，致使不能实现合同目的的，承租人可以解除合同。

　第二百三十二条　当事人对租赁期限没有约定或者约定不明确，依照本法第六十一条　的规定仍不能确定的，视为不定期租赁。当事人可以随时解除合同，但出租人解除合同应当在合理期限之前通知承租人。

　第二百三十三条　租赁物危及承租人的安全或者健康的，即使承租人订立合同时明知该租赁物质量不合格，承租人仍然可以随时解除合同。

　第二百三十四条　承租人在房屋租赁期间死亡的，与其生前共同居住的人可以按照原租赁合同租赁该房屋。

　第二百三十五条　租赁期间届满，承租人应当返还租赁物。返还的租赁物应当符合按照约定或者租赁物的性质使用后的状态。

　第二百三十六条　租赁期间届满，承租人继续使用租赁物，出租人没有提出异议的，原租赁合同继续有效，但租赁期限为不定期。

　　　　　　　　　　　 第十四章　融资租赁合同


　第二百三十七条　融资租赁合同是出租人根据承租人对出卖人、租赁物的选择，向出卖人购买租赁物，提供给承租人使用，承租人支付租金的合同。

　第二百三十八条　融资租赁合同的内容包括租赁物名称、数量、规格、技术性能、检验方法、租赁期限、租金构成及其支付期限和方式、币种、租赁期间届满租赁物的归属等条款。
　　融资租赁合同应当采用书面形式。

　第二百三十九条　出租人根据承租人对出卖人、租赁物的选择订立的买卖合同，出卖人应当按照约定向承租人交付标的物，承租人享有与受领标的物有关的买受人的权利。

　第二百四十条　出租人、出卖人、承租人可以约定，出卖人不履行买卖合同义务的，由承租人行使索赔的权利。承租人行使索赔权利的，出租人应当协助。

　第二百四十一条　出租人根据承租人对出卖人、租赁物的选择订立的买卖合同，未经承租人同意，出租人不得变更与承租人有关的合同内容。

　第二百四十二条　出租人享有租赁物的所有权。承租人破产的，租赁物不属于破产财产。

　第二百四十三条　融资租赁合同的租金，除当事人另有约定的以外，应当根据购买租赁物的大部分或者全部成本以及出租人的合理利润确定。

　第二百四十四条　租赁物不符合约定或者不符合使用目的的，出租人不承担责任，但承租人依赖出租人的技能确定租赁物或者出租人干预选择租赁物的除外。

　第二百四十五条　出租人应当保证承租人对租赁物的占有和使用。

　第二百四十六条　承租人占有租赁物期间，租赁物造成第三人的人身伤害或者财产损害的，出租人不承担责任。

　第二百四十七条　承租人应当妥善保管、使用租赁物。
　　承租人应当履行占有租赁物期间的维修义务。

　第二百四十八条　承租人应当按照约定支付租金。承租人经催告后在合理期限内仍不支付租金的，出租人可以要求支付全部租金；也可以解除合同，收回租赁物。

　第二百四十九条　当事人约定租赁期间届满租赁物归承租人所有，承租人已经支付大部分租金，但无力支付剩余租金，出租人因此解除合同收回租赁物的，收回的租赁物的价值超过承租人欠付的租金以及其他费用的，承租人可以要求部分返还。

　第二百五十条　出租人和承租人可以约定租赁期间届满租赁物的归属。对租赁物的归属没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，租赁物的所有权归出租人。

　　　　　　　　　　　　 第十五章　承揽合同


　第二百五十一条　承揽合同是承揽人按照定作人的要求完成工作，交付工作成果，定作人给付报酬的合同。
　　承揽包括加工、定作、修理、复制、测试、检验等工作。

　第二百五十二条　承揽合同的内容包括承揽的标的、数量、质量、报酬、承揽方式、材料的提供、履行期限、验收标准和方法等条款。

　第二百五十三条　承揽人应当以自己的设备、技术和劳力，完成主要工作，但当事人另有约定的除外。
　　承揽人将其承揽的主要工作交由第三人完成的，应当就该第三人完成的工作成果向定作人负责；未经定作人同意的，定作人也可以解除合同。

　第二百五十四条　承揽人可以将其承揽的辅助工作交由第三人完成。承揽人将其承揽的辅助工作交由第三人完成的，应当就该第三人完成的工作成果向定作人负责。

　第二百五十五条　承揽人提供材料的，承揽人应当按照约定选用材料，并接受定作人检验。

　第二百五十六条　定作人提供材料的，定作人应当按照约定提供材料。承揽人对定作人提供的材料，应当及时检验，发现不符合约定时，应当及时通知定作人更换、补齐或者采取其他补救措施。
　　承揽人不得擅自更换定作人提供的材料，不得更换不需要修理的零部件。

　第二百五十七条　承揽人发现定作人提供的图纸或者技术要求不合理的，应当及时通知定作人。因定作人怠于答复等原因造成承揽人损失的，应当赔偿损失。

　第二百五十八条　定作人中途变更承揽工作的要求，造成承揽人损失的，应当赔偿损失。

　第二百五十九条　承揽工作需要定作人协助的，定作人有协助的义务。定作人不履行协助义务致使承揽工作不能完成的，承揽人可以催告定作人在合理期限内履行义务，并可以顺延履行期限；定作人逾期不履行的，承揽人可以解除合同。

　第二百六十条　承揽人在工作期间，应当接受定作人必要的监督检验。定作人不得因监督检验妨碍承揽人的正常工作。

　第二百六十一条　承揽人完成工作的，应当向定作人交付工作成果，并提交必要的技术资料和有关质量证明。定作人应当验收该工作成果。

　第二百六十二条　承揽人交付的工作成果不符合质量要求的，定作人可以要求承揽人承担修理、重作、减少报酬、赔偿损失等违约责任。

　第二百六十三条　定作人应当按照约定的期限支付报酬。对支付报酬的期限没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，定作人应当在承揽人交付工作成果时支付；工作成果部分交付的，定作人应当相应支付。

　第二百六十四条　定作人未向承揽人支付报酬或者材料费等价款的，承揽人对完成的工作成果享有留置权，但当事人另有约定的除外。

　第二百六十五条　承揽人应当妥善保管定作人提供的材料以及完成的工作成果，因保管不善造成毁损、灭失的，应当承担损害赔偿责任。

　第二百六十六条　承揽人应当按照定作人的要求保守秘密，未经定作人许可，不得留存复制品或者技术资料。

　第二百六十七条　共同承揽人对定作人承担连带责任，但当事人另有约定的除外。

　第二百六十八条　定作人可以随时解除承揽合同，造成承揽人损失的，应当赔偿损失。

　　　　　　　　　　　 第十六章　建设工程合同


　第二百六十九条　建设工程合同是承包人进行工程建设，发包人支付价款的合同。
　　建设工程合同包括工程勘察、设计、施工合同。

　第二百七十条　建设工程合同应当采用书面形式。

　第二百七十一条　建设工程的招标投标活动，应当依照有关法律的规定公开、公平、公正进行。

　第二百七十二条　发包人可以与总承包人订立建设工程合同，也可以分别与勘察人、设计人、施工人订立勘察、设计、施工承包合同。发包人不得将应当由一个承包人完成的建设工程肢解成若干部分发包给几个承包人。
　　总承包人或者勘察、设计、施工承包人经发包人同意，可以将自己承包的部分工作交由第三人完成。第三人就其完成的工作成果与总承包人或者勘察、设计、施工承包人向发包人承担连带责任。承包人不得将其承包的全部建设工程转包给第三人或者将其承包的全部建设工程肢解以后以分包的名义分别转包给第三人。
　　禁止承包人将工程分包给不具备相应资质条件的单位。禁止分包单位将其承包的工程再分包。建设工程主体结构的施工必须由承包人自行完成。

　第二百七十三条　国家重大建设工程合同，应当按照国家规定的程序和国家批准的投资计划、可行性研究报告等文件订立。

　第二百七十四条　勘察、设计合同的内容包括提交有关基础资料和文件（包括概预算）的期限、质量要求、费用以及其他协作条件等条款。

　第二百七十五条　施工合同的内容包括工程范围、建设工期、中间交工工程的开工和竣工时间、工程质量、工程造价、技术资料交付时间、材料和设备供应责任、拨款和结算、竣工验收、质量保修范围和质量保证期、双方相互协作等条款。

　第二百七十六条　建设工程实行监理的，发包人应当与监理人采用书面形式订立委托监理合同。发包人与监理人的权利和义务以及法律责任，应当依照本法委托合同以及其他有关法律、行政法规的规定。

　第二百七十七条　发包人在不妨碍承包人正常作业的情况下，可以随时对作业进度、质量进行检查。

　第二百七十八条　隐蔽工程在隐蔽以前，承包人应当通知发包人检查。发包人没有及时检查的，承包人可以顺延工程日期，并有权要求赔偿停工、窝工等损失。

　第二百七十九条　建设工程竣工后，发包人应当根据施工图纸及说明书、国家颁发的施工验收规范和质量检验标准及时进行验收。验收合格的，发包人应当按照约定支付价款，并接收该建设工程。建设工程竣工经验收合格后，方可交付使用；未经验收或者验收不合格的，不得交付使用。

　第二百八十条　勘察、设计的质量不符合要求或者未按照期限提交勘察、设计文件拖延工期，造成发包人损失的，勘察人、设计人应当继续完善勘察、设计，减收或者免收勘察、设计费并赔偿损失。

　第二百八十一条　因施工人的原因致使建设工程质量不符合约定的，发包人有权要求施工人在合理期限内无偿修理或者返工、改建。经过修理或者返工、改建后，造成逾期交付的，施工人应当承担违约责任。

　第二百八十二条　因承包人的原因致使建设工程在合理使用期限内造成人身和财产损害的，承包人应当承担损害赔偿责任。

　第二百八十三条　发包人未按照约定的时间和要求提供原材料、设备、场地、资金、技术资料的，承包人可以顺延工程日期，并有权要求赔偿停工、窝工等损失。

　第二百八十四条　因发包人的原因致使工程中途停建、缓建的，发包人应当采取措施弥补或者减少损失，赔偿承包人因此造成的停工、窝工、倒运、机械设备调迁、材料和构件积压等损失和实际费用。

　第二百八十五条　因发包人变更计划，提供的资料不准确，或者未按照期限提供必需的勘察、设计工作条件而造成勘察、设计的返工、停工或者修改设计，发包人应当按照勘察人、设计人实际消耗的工作量增付费用。

　第二百八十六条　发包人未按照约定支付价款的，承包人可以催告发包人在合理期限内支付价款。发包人逾期不支付的，除按照建设工程的性质不宜折价、拍卖的以外，承包人可以与发包人协议将该工程折价，也可以申请人民法院将该工程依法拍卖。建设工程的价款就该工程折价或者拍卖的价款优先受偿。

　第二百八十七条　本章没有规定的，适用承揽合同的有关规定。

　　　　　　　　　　　　 第十七章　运输合同


　　　　　　　　　　　　　第一节　一般规定


　第二百八十八条　运输合同是承运人将旅客或者货物从起运地点运输到约定地点，旅客、托运人或者收货人支付票款或者运输费用的合同。

　第二百八十九条　从事公共运输的承运人不得拒绝旅客、托运人通常、合理的运输要求。

　第二百九十条　承运人应当在约定期间或者合理期间内将旅客、货物安全运输到约定地点。

　第二百九十一条　承运人应当按照约定的或者通常的运输路线将旅客、货物运输到约定地点。

　第二百九十二条　旅客、托运人或者收货人应当支付票款或者运输费用。承运人未按照约定路线或者通常路线运输增加票款或者运输费用的，旅客、托运人或者收货人可以拒绝支付增加部分的票款或者运输费用。

　　　　　　　　　　　　　第二节　客运合同


　第二百九十三条　客运合同自承运人向旅客交付客票时成立，但当事人另有约定或者另有交易习惯的除外。

　第二百九十四条　旅客应当持有效客票乘运。旅客无票乘运、超程乘运、越级乘运或者持失效客票乘运的，应当补交票款，承运人可以按照规定加收票款。旅客不交付票款的，承运人可以拒绝运输。

　第二百九十五条　旅客因自己的原因不能按照客票记载的时间乘坐的，应当在约定的时间内办理退票或者变更手续。逾期办理的，承运人可以不退票款，并不再承担运输义务。

　第二百九十六条　旅客在运输中应当按照约定的限量携带行李。超过限量携带行李的，应当办理托运手续。

　第二百九十七条　旅客不得随身携带或者在行李中夹带易燃、易爆、有毒、有腐蚀性、有放射性以及有可能危及运输工具上人身和财产安全的危险物品或者其他违禁物品。
　　旅客违反前款规定的，承运人可以将违禁物品卸下、销毁或者送交有关部门。旅客坚持携带或者夹带违禁物品的，承运人应当拒绝运输。

　第二百九十八条　承运人应当向旅客及时告知有关不能正常运输的重要事由和安全运输应当注意的事项。

　第二百九十九条　承运人应当按照客票载明的时间和班次运输旅客。承运人迟延运输的，应当根据旅客的要求安排改乘其他班次或者退票。

　第三百条　承运人擅自变更运输工具而降低服务标准的，应当根据旅客的要求退票或者减收票款；提高服务标准的，不应当加收票款。

　第三百零一条　承运人在运输过程中，应当尽力救助患有急病、分娩、遇险的旅客。

　第三百零二条　承运人应当对运输过程中旅客的伤亡承担损害赔偿责任，但伤亡是旅客自身健康原因造成的或者承运人证明伤亡是旅客故意、重大过失造成的除外。
　　前款规定适用于按照规定免票、持优待票或者经承运人许可搭乘的无票旅客。

　第三百零三条　在运输过程中旅客自带物品毁损、灭失，承运人有过错的，应当承担损害赔偿责任。
　　旅客托运的行李毁损、灭失的，适用货物运输的有关规定。

　　　　　　　　　　　　　第三节　货运合同


　第三百零四条　托运人办理货物运输，应当向承运人准确表明收货人的名称或者姓名或者凭指示的收货人，货物的名称、性质、重量、数量，收货地点等有关货物运输的必要情况。
　　因托运人申报不实或者遗漏重要情况，造成承运人损失的，托运人应当承担损害赔偿责任。

　第三百零五条　货物运输需要办理审批、检验等手续的，托运人应当将办理完有关手续的文件提交承运人。

　第三百零六条　托运人应当按照约定的方式包装货物。对包装方式没有约定或者约定不明确的，适用本法第一百五十六条的规定。
　　托运人违反前款规定的，承运人可以拒绝运输。

　第三百零七条　托运人托运易燃、易爆、有毒、有腐蚀性、有放射性等危险物品的，应当按照国家有关危险物品运输的规定对危险物品妥善包装，作出危险物标志和标签，并将有关危险物品的名称、性质和防范措施的书面材料提交承运人。
　　托运人违反前款规定的，承运人可以拒绝运输，也可以采取相应措施以避免损失的发生，因此产生的费用由托运人承担。

　第三百零八条　在承运人将货物交付收货人之前，托运人可以要求承运人中止运输、返还货物、变更到达地或者将货物交给其他收货人，但应当赔偿承运人因此受到的损失。

　第三百零九条　货物运输到达后，承运人知道收货人的，应当及时通知收货人，收货人应当及时提货。收货人逾期提货的，应当向承运人支付保管费等费用。

　第三百一十条　收货人提货时应当按照约定的期限检验货物。对检验货物的期限没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，应当在合理期限内检验货物。收货人在约定的期限或者合理期限内对货物的数量、毁损等未提出异议的，视为承运人已经按照运输单证的记载交付的初步证据。

　第三百一十一条　承运人对运输过程中货物的毁损、灭失承担损害赔偿责任，但承运人证明货物的毁损、灭失是因不可抗力、货物本身的自然性质或者合理损耗以及托运人、收货人的过错造成的，不承担损害赔偿责任。

　第三百一十二条　货物的毁损、灭失的赔偿额，当事人有约定的，按照其约定；没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，按照交付或者应当交付时货物到达地的市场价格计算。法律、行政法规对赔偿额的计算方法和赔偿限额另有规定的，依照其规定。

　第三百一十三条　两个以上承运人以同一运输方式联运的，与托运人订立合同的承运人应当对全程运输承担责任。损失发生在某一运输区段的，与托运人订立合同的承运人和该区段的承运人承担连带责任。

　第三百一十四条　货物在运输过程中因不可抗力灭失，未收取运费的，承运人不得要求支付运费；已收取运费的，托运人可以要求返还。

　第三百一十五条　托运人或者收货人不支付运费、保管费以及其他运输费用的，承运人对相应的运输货物享有留置权，但当事人另有约定的除外。

　第三百一十六条　收货人不明或者收货人无正当理由拒绝受领货物的，依照本法第一百零一条的规定，承运人可以提存货物。

　　　　　　　　　　　　第四节　多式联运合同


　第三百一十七条　多式联运经营人负责履行或者组织履行多式联运合同，对全程运输享有承运人的权利，承担承运人的义务。

　第三百一十八条　多式联运经营人可以与参加多式联运的各区段承运人就多式联运合同的各区段运输约定相互之间的责任，但该约定不影响多式联运经营人对全程运输承担的义务。

　第三百一十九条　多式联运经营人收到托运人交付的货物时，应当签发多式联运单据。按照托运人的要求，多式联运单据可以是可转让单据，也可以是不可转让单据。

　第三百二十条　因托运人托运货物时的过错造成多式联运经营人损失的，即使托运人已经转让多式联运单据，托运人仍然应当承担损害赔偿责任。

　第三百二十一条　货物的毁损、灭失发生于多式联运的某一运输区段的，多式联运经营人的赔偿责任和责任限额，适用调整该区段运输方式的有关法律规定。货物毁损、灭失发生的运输区段不能确定的，依照本章规定承担损害赔偿责任。

　　　　　　　　　　　　 第十八章　技术合同


　　　　　　　　　　　　　第一节　一般规定


　第三百二十二条　技术合同是当事人就技术开发、转让、咨询或者服务订立的确立相互之间权利和义务的合同。

　第三百二十三条　订立技术合同，应当有利于科学技术的进步，加速科学技术成果的转化、应用和推广。

　第三百二十四条　技术合同的内容由当事人约定，一般包括以下条款：
　　（一）项目名称；
　　（二）标的的内容、范围和要求；
　　（三）履行的计划、进度、期限、地点、地域和方式；
　　（四）技术情报和资料的保密；
　　（五）风险责任的承担；
　　（六）技术成果的归属和收益的分成办法；
　　（七）验收标准和方法；
　　（八）价款、报酬或者使用费及其支付方式；
　　（九）违约金或者损失赔偿的计算方法；
　　（十）解决争议的方法；
　　（十一）名词和术语的解释。
　　与履行合同有关的技术背景资料、可行性论证和技术评价报告、项目任务书和计划书、技术标准、技术规范、原始设计和工艺文件，以及其他技术文档，按照当事人的约定可以作为合同的组成部分。
　　技术合同涉及专利的，应当注明发明创造的名称、专利申请人和专利权人、申请日期、申请号、专利号以及专利权的有效期限。

　第三百二十五条　技术合同价款、报酬或者使用费的支付方式由当事人约定，可以采取一次总算、一次总付或者一次总算、分期支付，也可以采取提成支付或者提成支付附加预付入门费的方式。
　　约定提成支付的，可以按照产品价格、实施专利和使用技术秘密后新增的产值、利润或者产品销售额的一定比例提成，也可以按照约定的其他方式计算。提成支付的比例可以采取固定比例、逐年递增比例或者逐年递减比例。
　　约定提成支付的，当事人应当在合同中约定查阅有关会计帐目的办法。

　第三百二十六条　职务技术成果的使用权、转让权属于法人或者其他组织的，法人或者其他组织可以就该项职务技术成果订立技术合同。法人或者其他组织应当从使用和转让该项职务技术成果所取得的收益中提取一定比例，对完成该项职务技术成果的个人给予奖励或者报酬。法人或者其他组织订立技术合同转让职务技术成果时，职务技术成果的完成人享有以同等条件优先受让的权利。
　　职务技术成果是执行法人或者其他组织的工作任务，或者主要是利用法人或者其他组织的物质技术条件所完成的技术成果。

　第三百二十七条　非职务技术成果的使用权、转让权属于完成技术成果的个人，完成技术成果的个人可以就该项非职务技术成果订立技术合同。

　第三百二十八条　完成技术成果的个人有在有关技术成果文件上写明自己是技术成果完成者的权利和取得荣誉证书、奖励的权利。

　第三百二十九条　非法垄断技术、妨碍技术进步或者侵害他人技术成果的技术合同无效。

　　　　　　　　　　　　第二节　技术开发合同


　第三百三十条　技术开发合同是指当事人之间就新技术、新产品、新工艺或者新材料及其系统的研究开发所订立的合同。
　　技术开发合同包括委托开发合同和合作开发合同。
　　技术开发合同应当采用书面形式。
　　当事人之间就具有产业应用价值的科技成果实施转化订立的合同，参照技术开发合同的规定。

　第三百三十一条　委托开发合同的委托人应当按照约定支付研究开发经费和报酬；提供技术资料、原始数据；完成协作事项；接受研究开发成果。

　第三百三十二条　委托开发合同的研究开发人应当按照约定制定和实施研究开发计划；合理使用研究开发经费；按期完成研究开发工作，交付研究开发成果，提供有关的技术资料和必要的技术指导，帮助委托人掌握研究开发成果。

　第三百三十三条　委托人违反约定造成研究开发工作停滞、延误或者失败的，应当承担违约责任。

　第三百三十四条　研究开发人违反约定造成研究开发工作停滞、延误或者失败的，应当承担违约责任。

　第三百三十五条　合作开发合同的当事人应当按照约定进行投资，包括以技术进行投资；分工参与研究开发工作；协作配合研究开发工作。

　第三百三十六条　合作开发合同的当事人违反约定造成研究开发工作停滞、延误或者失败的，应当承担违约责任。

　第三百三十七条　因作为技术开发合同标的的技术已经由他人公开，致使技术开发合同的履行没有意义的，当事人可以解除合同。

　第三百三十八条　在技术开发合同履行过程中，因出现无法克服的技术困难，致使研究开发失败或者部分失败的，该风险责任由当事人约定。没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，风险责任由当事人合理分担。
　　当事人一方发现前款规定的可能致使研究开发失败或者部分失败的情形时，应当及时通知另一方并采取适当措施减少损失。没有及时通知并采取适当措施，致使损失扩大的，应当就扩大的损失承担责任。

　第三百三十九条　委托开发完成的发明创造，除当事人另有约定的以外，申请专利的权利属于研究开发人。研究开发人取得专利权的，委托人可以免费实施该专利。
　　研究开发人转让专利申请权的，委托人享有以同等条件优先受让的权利。

　第三百四十条　合作开发完成的发明创造，除当事人另有约定的以外，申请专利的权利属于合作开发的当事人共有。当事人一方转让其共有的专利申请权的，其他各方享有以同等条件优先受让的权利。
　　合作开发的当事人一方声明放弃其共有的专利申请权的，可以由另一方单独申请或者由其他各方共同申请。申请人取得专利权的，放弃专利申请权的一方可以免费实施该专利。
　　合作开发的当事人一方不同意申请专利的，另一方或者其他各方不得申请专利。

　第三百四十一条　委托开发或者合作开发完成的技术秘密成果的使用权、转让权以及利益的分配办法，由当事人约定。没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，当事人均有使用和转让的权利，但委托开发的研究开发人不得在向委托人交付研究开发成果之前，将研究开发成果转让给第三人。

　　　　　　　　　　　　第三节　技术转让合同


　第三百四十二条　技术转让合同包括专利权转让、专利申请权转让、技术秘密转让、专利实施许可合同。技术转让合同应当采用书面形式。

　第三百四十三条　技术转让合同可以约定让与人和受让人实施专利或者使用技术秘密的范围，但不得限制技术竞争和技术发展。

　第三百四十四条　专利实施许可合同只在该专利权的存续期间内有效。专利权有效期限届满或者专利权被宣布无效的，专利权人不得就该专利与他人订立专利实施许可合同。

　第三百四十五条　专利实施许可合同的让与人应当按照约定许可受让人实施专利，交付实施专利有关的技术资料，提供必要的技术指导。

　第三百四十六条　专利实施许可合同的受让人应当按照约定实施专利，不得许可约定以外的第三人实施该专利；并按照约定支付使用费。

　第三百四十七条　技术秘密转让合同的让与人应当按照约定提供技术资料，进行技术指导，保证技术的实用性、可靠性，承担保密义务。

　第三百四十八条　技术秘密转让合同的受让人应当按照约定使用技术，支付使用费，承担保密义务。

　第三百四十九条　技术转让合同的让与人应当保证自己是所提供的技术的合法拥有者，并保证所提供的技术完整、无误、有效，能够达到约定的目标。

　第三百五十条　技术转让合同的受让人应当按照约定的范围和期限，对让与人提供的技术中尚未公开的秘密部分，承担保密义务。

　第三百五十一条　让与人未按照约定转让技术的，应当返还部分或者全部使用费，并应当承担违约责任；实施专利或者使用技术秘密超越约定的范围的，违反约定擅自许可第三人实施该项专利或者使用该项技术秘密的，应当停止违约行为，承担违约责任；违反约定的保密义务的，应当承担违约责任。

　第三百五十二条　受让人未按照约定支付使用费的，应当补交使用费并按照约定支付违约金；不补交使用费或者支付违约金的，应当停止实施专利或者使用技术秘密，交还技术资料，承担违约责任；实施专利或者使用技术秘密超越约定的范围的，未经让与人同意擅自许可第三人实施该专利或者使用该技术秘密的，应当停止违约行为，承担违约责任；违反约定的保密义务的，应当承担违约责任。

　第三百五十三条　受让人按照约定实施专利、使用技术秘密侵害他人合法权益的，由让与人承担责任，但当事人另有约定的除外。

　第三百五十四条　当事人可以按照互利的原则，在技术转让合同中约定实施专利、使用技术秘密后续改进的技术成果的分享办法。没有约定或者约定不明确，依照本法第六十一条　的规定仍不能确定的，一方后续改进的技术成果，其他各方无权分享。

　第三百五十五条　法律、行政法规对技术进出口合同或者专利、专利申请合同另有规定的，依照其规定。

　　　　　　　　 第四节　技术咨询合同和技术服务合同


　第三百五十六条　技术咨询合同包括就特定技术项目提供可行性论证、技术预测、专题技术调查、分析评价报告等合同。
　　技术服务合同是指当事人一方以技术知识为另一方解决特定技术问题所订立的合同，不包括建设工程合同和承揽合同。

　第三百五十七条　技术咨询合同的委托人应当按照约定阐明咨询的问题，提供技术背景材料及有关技术资料、数据；接受受托人的工作成果，支付报酬。

　第三百五十八条　技术咨询合同的受托人应当按照约定的期限完成咨询报告或者解答问题；提出的咨询报告应当达到约定的要求。

　第三百五十九条　技术咨询合同的委托人未按照约定提供必要的资料和数据，影响工作进度和质量，不接受或者逾期接受工作成果的，支付的报酬不得追回，未支付的报酬应当支付。
　　技术咨询合同的受托人未按期提出咨询报告或者提出的咨询报告不符合约定的，应当承担减收或者免收报酬等违约责任。
　　技术咨询合同的委托人按照受托人符合约定要求的咨询报告和意见作出决策所造成的损失，由委托人承担，但当事人另有约定的除外。

　第三百六十条　技术服务合同的委托人应当按照约定提供工作条件，完成配合事项；接受工作成果并支付报酬。

　第三百六十一条　技术服务合同的受托人应当按照约定完成服务项目，解决技术问题，保证工作质量，并传授解决技术问题的知识。

　第三百六十二条　技术服务合同的委托人不履行合同义务或者履行合同义务不符合约定，影响工作进度和质量，不接受或者逾期接受工作成果的，支付的报酬不得追回，未支付的报酬应当支付。
　　技术服务合同的受托人未按照合同约定完成服务工作的，应当承担免收报酬等违约责任。

　第三百六十三条　在技术咨询合同、技术服务合同履行过程中，受托人利用委托人提供的技术资料和工作条件完成的新的技术成果，属于受托人。委托人利用受托人的工作成果完成的新的技术成果，属于委托人。当事人另有约定的，按照其约定。

　第三百六十四条　法律、行政法规对技术中介合同、技术培训合同另有规定的，依照其规定。

　　　　　　　　　　　　 第十九章　保管合同


　第三百六十五条　保管合同是保管人保管寄存人交付的保管物，并返还该物的合同。

　第三百六十六条　寄存人应当按照约定向保管人支付保管费。
　　当事人对保管费没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，保管是无偿的。

　第三百六十七条　保管合同自保管物交付时成立，但当事人另有约定的除外。

　第三百六十八条　寄存人向保管人交付保管物的，保管人应当给付保管凭证，但另有交易习惯的除外。

　第三百六十九条　保管人应当妥善保管保管物。
　　当事人可以约定保管场所或者方法。除紧急情况或者为了维护寄存人利益的以外，不得擅自改变保管场所或者方法。

　第三百七十条　寄存人交付的保管物有瑕疵或者按照保管物的性质需要采取特殊保管措施的，寄存人应当将有关情况告知保管人。寄存人未告知，致使保管物受损失的，保管人不承担损害赔偿责任；保管人因此受损失的，除保管人知道或者应当知道并且未采取补救措施的以外，寄存人应当承担损害赔偿责任。

　第三百七十一条　保管人不得将保管物转交第三人保管，但当事人另有约定的除外。
　　保管人违反前款规定，将保管物转交第三人保管，对保管物造成损失的，应当承担损害赔偿责任。

　第三百七十二条　保管人不得使用或者许可第三人使用保管物，但当事人另有约定的除外。

　第三百七十三条　第三人对保管物主张权利的，除依法对保管物采取保全或者执行的以外，保管人应当履行向寄存人返还保管物的义务。
　　第三人对保管人提起诉讼或者对保管物申请扣押的，保管人应当及时通知寄存人。

　第三百七十四条　保管期间，因保管人保管不善造成保管物毁损、灭失的，保管人应当承担损害赔偿责任，但保管是无偿的，保管人证明自己没有重大过失的，不承担损害赔偿责任。

　第三百七十五条　寄存人寄存货币、有价证券或者其他贵重物品的，应当向保管人声明，由保管人验收或者封存。寄存人未声明的，该物品毁损、灭失后，保管人可以按照一般物品予以赔偿。

　第三百七十六条　寄存人可以随时领取保管物。
　　当事人对保管期间没有约定或者约定不明确的，保管人可以随时要求寄存人领取保管物；约定保管期间的，保管人无特别事由，不得要求寄存人提前领取保管物。

　第三百七十七条　保管期间届满或者寄存人提前领取保管物的，保管人应当将原物及其孳息归还寄存人。

　第三百七十八条　保管人保管货币的，可以返还相同种类、数量的货币。保管其他可替代物的，可以按照约定返还相同种类、品质、数量的物品。

　第三百七十九条　有偿的保管合同，寄存人应当按照约定的期限向保管人支付保管费。
　　当事人对支付期限没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，应当在领取保管物的同时支付。

　第三百八十条　寄存人未按照约定支付保管费以及其他费用的，保管人对保管物享有留置权，但当事人另有约定的除外。

　　　　　　　　　　　　 第二十章　仓储合同


　第三百八十一条　仓储合同是保管人储存存货人交付的仓储物，存货人支付仓储费的合同。

　第三百八十二条　仓储合同自成立时生效。

　第三百八十三条　储存易燃、易爆、有毒、有腐蚀性、有放射性等危险物品或者易变质物品，存货人应当说明该物品的性质，提供有关资料。
　　存货人违反前款规定的，保管人可以拒收仓储物，也可以采取相应措施以避免损失的发生，因此产生的费用由存货人承担。
　　保管人储存易燃、易爆、有毒、有腐蚀性、有放射性等危险物品的，应当具备相应的保管条件。

　第三百八十四条　保管人应当按照约定对入库仓储物进行验收。保管人验收时发现入库仓储物与约定不符合的，应当及时通知存货人。保管人验收后，发生仓储物的品种、数量、质量不符合约定的，保管人应当承担损害赔偿责任。

　第三百八十五条　存货人交付仓储物的，保管人应当给付仓单。

　第三百八十六条　保管人应当在仓单上签字或者盖章。仓单包括下列事项：
　　（一）存货人的名称或者姓名和住所；
　　（二）仓储物的品种、数量、质量、包装、件数和标记；
　　（三）仓储物的损耗标准；
　　（四）储存场所；
　　（五）储存期间；
　　（六）仓储费；
　　（七）仓储物已经办理保险的，其保险金额、期间以及保险人的名称；
　　（八）填发人、填发地和填发日期。

　第三百八十七条　仓单是提取仓储物的凭证。存货人或者仓单持有人在仓单上背书并经保管人签字或者盖章的，可以转让提取仓储物的权利。

　第三百八十八条　保管人根据存货人或者仓单持有人的要求，应当同意其检查仓储物或者提取样品。

　第三百八十九条　保管人对入库仓储物发现有变质或者其他损坏的，应当及时通知存货人或者仓单持有人。

　第三百九十条　保管人对入库仓储物发现有变质或者其他损坏，危及其他仓储物的安全和正常保管的，应当催告存货人或者仓单持有人作出必要的处置。因情况紧急，保管人可以作出必要的处置，但事后应当将该情况及时通知存货人或者仓单持有人。

　第三百九十一条　当事人对储存期间没有约定或者约定不明确的，存货人或者仓单持有人可以随时提取仓储物，保管人也可以随时要求存货人或者仓单持有人提取仓储物，但应当给予必要的准备时间。

　第三百九十二条　储存期间届满，存货人或者仓单持有人应当凭仓单提取仓储物。存货人或者仓单持有人逾期提取的，应当加收仓储费；提前提取的，不减收仓储费。

　第三百九十三条　储存期间届满，存货人或者仓单持有人不提取仓储物的，保管人可以催告其在合理期限内提取，逾期不提取的，保管人可以提存仓储物。

　第三百九十四条　储存期间，因保管人保管不善造成仓储物毁损、灭失的，保管人应当承担损害赔偿责任。因仓储物的性质、包装不符合约定或者超过有效储存期造成仓储物变质、损坏的，保管人不承担损害赔偿责任。

　第三百九十五条　本章没有规定的，适用保管合同的有关规定。

　　　　　　　　　　　　第二十一章　委托合同


　第三百九十六条　委托合同是委托人和受托人约定，由受托人处理委托人事务的合同。

　第三百九十七条　委托人可以特别委托受托人处理一项或者数项事务，也可以概括委托受托人处理一切事务。

　第三百九十八条　委托人应当预付处理委托事务的费用。受托人为处理委托事务垫付的必要费用，委托人应当偿还该费用及其利息。

　第三百九十九条　受托人应当按照委托人的指示处理委托事务。需要变更委托人指示的，应当经委托人同意；因情况紧急，难以和委托人取得联系的，受托人应当妥善处理委托事务，但事后应当将该情况及时报告委托人。

　第四百条　受托人应当亲自处理委托事务。经委托人同意，受托人可以转委托。转委托经同意的，委托人可以就委托事务直接指示转委托的第三人，受托人仅就第三人的选任及其对第三人的指示承担责任。转委托未经同意的，受托人应当对转委托的第三人的行为承担责任，但在紧急情况下受托人为维护委托人的利益需要转委托的除外。

　第四百零一条　受托人应当按照委托人的要求，报告委托事务的处理情况。委托合同终止时，受托人应当报告委托事务的结果。

　第四百零二条　受托人以自己的名义，在委托人的授权范围内与第三人订立的合同，第三人在订立合同时知道受托人与委托人之间的代理关系的，该合同直接约束委托人和第三人，但有确切证据证明该合同只约束受托人和第三人的除外。

　第四百零三条　受托人以自己的名义与第三人订立合同时，第三人不知道受托人与委托人之间的代理关系的，受托人因第三人的原因对委托人不履行义务，受托人应当向委托人披露第三人，委托人因此可以行使受托人对第三人的权利，但第三人与受托人订立合同时如果知道该委托人就不会订立合同的除外。
　　受托人因委托人的原因对第三人不履行义务，受托人应当向第三人披露委托人，第三人因此可以选择受托人或者委托人作为相对人主张其权利，但第三人不得变更选定的相对人。
　　委托人行使受托人对第三人的权利的，第三人可以向委托人主张其对受托人的抗辩。第三人选定委托人作为其相对人的，委托人可以向第三人主张其对受托人的抗辩以及受托人对第三人的抗辩。

　第四百零四条　受托人处理委托事务取得的财产，应当转交给委托人。

　第四百零五条　受托人完成委托事务的，委托人应当向其支付报酬。因不可归责于受托人的事由，委托合同解除或者委托事务不能完成的，委托人应当向受托人支付相应的报酬。当事人另有约定的，按照其约定。

　第四百零六条　有偿的委托合同，因受托人的过错给委托人造成损失的，委托人可以要求赔偿损失。无偿的委托合同，因受托人的故意或者重大过失给委托人造成损失的，委托人可以要求赔偿损失。
　　受托人超越权限给委托人造成损失的，应当赔偿损失。

　第四百零七条　受托人处理委托事务时，因不可归责于自己的事由受到损失的，可以向委托人要求赔偿损失。

　第四百零八条　委托人经受托人同意，可以在受托人之外委托第三人处理委托事务。因此给受托人造成损失的，受托人可以向委托人要求赔偿损失。

　第四百零九条　两个以上的受托人共同处理委托事务的，对委托人承担连带责任。

　第四百一十条　委托人或者受托人可以随时解除委托合同。因解除合同给对方造成损失的，除不可归责于该当事人的事由以外，应当赔偿损失。

　第四百一十一条　委托人或者受托人死亡、丧失民事行为能力或者破产的，委托合同终止，但当事人另有约定或者根据委托事务的性质不宜终止的除外。

　第四百一十二条　因委托人死亡、丧失民事行为能力或者破产，致使委托合同终止将损害委托人利益的，在委托人的继承人、法定代理人或者清算组织承受委托事务之前，受托人应当继续处理委托事务。

　第四百一十三条　因受托人死亡、丧失民事行为能力或者破产，致使委托合同终止的，受托人的继承人、法定代理人或者清算组织应当及时通知委托人。因委托合同终止将损害委托人利益的，在委托人作出善后处理之前，受托人的继承人、法定代理人或者清算组织应当采取必要措施。

　　　　　　　　　　　　第二十二章　行纪合同


　第四百一十四条　行纪合同是行纪人以自己的名义为委托人从事贸易活动，委托人支付报酬的合同。

　第四百一十五条　行纪人处理委托事务支出的费用，由行纪人负担，但当事人另有约定的除外。

　第四百一十六条　行纪人占有委托物的，应当妥善保管委托物。

　第四百一十七条　委托物交付给行纪人时有瑕疵或者容易腐烂、变质的，经委托人同意，行纪人可以处分该物；和委托人不能及时取得联系的，行纪人可以合理处分。

　第四百一十八条　行纪人低于委托人指定的价格卖出或者高于委托人指定的价格买入的，应当经委托人同意。未经委托人同意，行纪人补偿其差额的，该买卖对委托人发生效力。
　　行纪人高于委托人指定的价格卖出或者低于委托人指定的价格买入的，可以按照约定增加报酬。没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，该利益属于委托人。
　　委托人对价格有特别指示的，行纪人不得违背该指示卖出或者买入。

　第四百一十九条　行纪人卖出或者买入具有市场定价的商品，除委托人有相反的意思表示的以外，行纪人自己可以作为买受人或者出卖人。
　　行纪人有前款规定情形的，仍然可以要求委托人支付报酬。

　第四百二十条　行纪人按照约定买入委托物，委托人应当及时受领。经行纪人催告，委托人无正当理由拒绝受领的，行纪人依照本法第一百零一条的规定可以提存委托物。
　　委托物不能卖出或者委托人撤回出卖，经行纪人催告，委托人不取回或者不处分该物的，行纪人依照本法第一百零一条的规定可以提存委托物。

　第四百二十一条　行纪人与第三人订立合同的，行纪人对该合同直接享有权利、承担义务。
　　第三人不履行义务致使委托人受到损害的，行纪人应 当承担损害赔偿责任，
但行纪人与委托人另有约定的除外。

　第四百二十二条　行纪人完成或者部分完成委托事务的，委托人应当向其支付相应的报酬。委托人逾期不支付报酬的，行纪人对委托物享有留置权，但当事人另有约定的除外。

　第四百二十三条　本章没有规定的，适用委托合同的有关规定。

　　　　　　　　　　　　第二十三章　居间合同


　第四百二十四条　居间合同是居间人向委托人报告订立合同的机会或者提供订立合同的媒介服务，委托人支付报酬的合同。

　第四百二十五条　居间人应当就有关订立合同的事项向委托人如实报告。
　　居间人故意隐瞒与订立合同有关的重要事实或者提供虚假情况，损害委托人利益的，不得要求支付报酬并应当承担损害赔偿责任。

　第四百二十六条　居间人促成合同成立的，委托人应当按照约定支付报酬。对居间人的报酬没有约定或者约定不明确，依照本法第六十一条的规定仍不能确定的，根据居间人的劳务合理确定。因居间人提供订立合同的媒介服务而促成合同成立的，由该合同的当事人平均负担居间人的报酬。
　　居间人促成合同成立的，居间活动的费用，由居间人负担。

　第四百二十七条　居间人未促成合同成立的，不得要求支付报酬，但可以要求委托人支付从事居间活动支出的必要费用。

　　　　　　　　　　　　　　　　附则

　第四百二十八条　本法自１９９９年１０月１日起施行，《中华人民共和国经济合同法》、《中华人民共和国涉外经济合同法》、《中华人民共和国技术合同法》同时废止。</pre>
</div>
<div title="善意取得" modifier="Steve" created="200911120845" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911120845">
<pre>|!概念|

|!法条|

|!构成要件|

|!法律要素|

|!法律解释|

|!案例|

|!比较|

|!其他|
</pre>
</div>
<div title="履行利益" modifier="Steve" created="200911111107" modified="200911111131" tags="法学 民法 名词解释" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911111131">
<pre>履行利益是指在合同如期履行后当事人所获得的全部利益。

履行利益又称为积极利益，也称为期待利益。

国外的立法一般是信赖利益以不超过履行利益为原则。当事人履行合同义务的目的是为了获得履行利益，如果信赖利益超出履行利益，实际上就超出了当事人在订立合同时的预期，就是不合理的。

期待利益与信赖利益两者之间有以下几点不同：
第一，两者的内涵不同。期待利益是指当事人在订立合同时期望通过合同履行获得的各种利益的总和，包括合同履行后可以获得的利益和因违约而导致的现有财产的减损灭失和费用的支出。信赖利益是指无过错的一方当事人信赖合同完满履行，在订立和履行合同中支出的费用和代价。
第二，对两者保护达到的状态不同。对于期待利益的保护可使合同在被违反的情况下达到合同被履行的状态，保护期待利益可替代合同的履行。而保护信赖利益旨在使非违约方因信赖合同的履行而支付的各种费用得到返还，从而使当事人恢复到合同订立之前的良好状态。第三，违约损害赔偿一般应适用期待利益，只有当期待利益无法计算而合同又不存在继续履行的可能时才适用信赖利益。</pre>
</div>
<div title="意思表示" modifier="Steve" created="200911071627" modified="200911100626" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100626">
<pre>意思表示是指行为人把进行某一民事[[法律行为]]的内心效果意思，以一定的方式表达于外部的行为。
意思表示的构成要素，指构成意思表示所必须具备的事实要素。
*德国学者通常认为意思表示由目的意思、效果意思、表示意思、行为意思和表示行为五要素构成。
*日本学者认为只有表示行为为意思表示的构成要素。
&gt;马俊驹《民法原论》认为意思表示由目的意思和法效意思两个主观要素和表示行为这一客观要素构成。
&lt;&lt;&lt;
!!@@color(red):目的意思@@
是指民事[[法律行为]]具体内容的意思要素，它是意思表示据以成立的基础。
!!@@color(red):法效意思@@
是指意思表示人欲使其表示内容引起法律上效力的内在意思要素，即具有设立、变更、终止民事[[法律关系]]的意图。
!!@@color(red):表示行为@@
是指行为人将其内在的意志以一定方式表现于外部，并足以为外界所客观理解的行为要素。
&lt;&lt;&lt;

&gt;王泽鉴在《民法总则》这本书中用很大的篇幅介绍了台湾地区民法中关于意思表示的理论。
&lt;&lt;&lt;
意思表示, 指将企图发生一定私法上效果的意思，表示于外部的行为。由两个要素构成：一为内心意思；二为此项内心意思的外部表示。前者是意思表示的主观要件，后者是意思表示的客观要件。主观要件与客观要件相统一，表意人就正确地表达了自己的意志，但是也常常发生意思与外部表示不相一致的情形。可分两类：一为意思与表示不一致，一为意思表示不自由。

一、意思与表示不一致又可以分为：

1、表意人知其意思与表示不一致而为意思表示，是为虚伪表示。

我国大陆学者一般将意思表示故意不一致分为真意保留、虚伪行为、隐藏行为和脱法行为（见梁慧星的《民法总论》第二版）。王泽鉴将虚伪表示又划分为单独虚伪表示和通谋虚伪表示。其中单独虚伪表示就是上述的真意保留，通谋虚伪表示就是虚伪行为。而隐藏行为与脱法行为则被归入通谋虚伪表示里面。

虚伪表示的效力：单独虚伪表示原则上是有效的，在有相对人的意思表示，可以主张其意思表示无效，但不得对抗善意第三人。在无相对人的情况下，不得主张无效。

通谋虚伪表示的效力：通谋虚伪表示在当事人间无效，但是不得以此对抗善意第三人。所谓不得对抗善意第三人是指。善意第三人可以主张其无效，也可以主张其有效。若主张有效时，表意人不得以无效对抗之。

 

2、表意人不知其意思与表示不一致，而为意思表示，是为错误。

错误又可分为动机错误、内容错误、表示行为错误、关于当事人资格或物之性质的错误、传达错误。

动机错误乃意思表示缘由的错误，即表意人在意思形成的过程中，对其决定为某特定内容意思表示具有重要性的事实，认识不正确。动机错误的风险应由表意人承担，不影响意思表达的效力。

内容错误指表意人表示其所欲为的表示，但误认其表示的客观意义。

表示行为错误即表意人误为表示其所意欲表示者，如误说、误写等。内容错误与表示行为错误法律赋予表意人可以撤销其意思表示。

关于当事人资格或物之性质的错误属于动机错误，本不影响意思表示的效力，但法律为保护表意人之利益，特例外将其拟制为意思表示内容错误，是表意人可以撤销其意思表示。当事人之资格或物之性质需为交易上认为重要者。（撤销与外观）

传达错误指传达机关或传达人传达不实，这种情况下表意人可以撤销之。如果是传达人故意变更表意人的意思，可以适用无权代理的规定，善意相对人可以向传达人主张损害赔偿的权利。

3、撤销权的行使问题：在虚伪表示情况下，表意人撤销其意思表示需要对信其意思表示有效而受损害的相对人与第三人负信赖利益赔偿责任。表意人撤销权的行使不得对抗善意第三人。在错误的情况下，王泽鉴在书中并没有写明表意人撤销其意思表示是否可以对抗善意第三人。根据文中的分析我认为错误的撤销权也应当不能对抗善意第三人。

 

二、意思表示不自由又可以分为：

1、诈欺，指对不真实的事实表示其为真实，而使表意人陷于错误，加深错误或保持错误。构成要件：①须有诈欺行为。②需诈欺行为与表意人陷于错误及为意思表示有因果关系③需诈欺行为为故意④需施行诈欺者为相对人或第三人。

如因诈欺而为意思表示者，可以主张撤销其意思表示，但其撤销不得对抗善意第三人。如果是第三人施行诈欺行为，需以相对人明知其受欺诈或可得而知者，始得撤销之。诈欺与错误会发生竞合的情况，但是因为其效力相同，所以并无区分之必要。

2、胁迫，指相对人或第三人故意告以危害致生恐惧而为意思表示。

①须有胁迫的行为。②需相对人因胁迫发生而为意思表示。③需胁迫人有胁迫之故意。④需胁迫系不法行为。

胁迫系由第三人所为，如果相对人为善意，则表意人仍可撤销之。

对于可以对抗善意第三人的效力有疑问！可以对抗善意第三人是指可以径直向第三人主张所有物返还请求权吗？王泽鉴书中说在胁迫的情况下，虽然第三人不得以善意对抗表意人，但是可以主张善意取得！
&lt;&lt;&lt;

@@总结：1234，日本1要素台湾2要素中国3中国4要素德国5要素。@@

|维基百科|
意思表示是表意人将欲发生一定私法上效力之意思，表现于外部的行为。一个意思表示包含了表示意思、效果意思和外部行为。

表示意思是表意人欲将内心意思表现于外部之意思；效果意思（亦称法效意思）是表意人欲发生一定私法上效力之意思；而外部行为则是表意人表现在外部的客观表示行为。
目录

    * 1 意思表示的种类
    * 2 意思表示的瑕疵
          2.1 意思与表示不一致
          2.2 意思表示不自由
    * 3 意思表示发生效力
          3.1 表示主义
          3.2 发信主义
          3.3 了解主义
          3.4 到达主义

意思表示的种类

意思表示依其是否具有相对人、方式为何、直接沟通与否，可以区分为做出以下几种分类：

    * 意思表示依其是否具有相对人，可分为“有相对人的意思表示”和“无相对人的意思表示”
    * 意思表示依其做成之方式，可分为“明示的意思表示”和“默示的意思表示”
          o 明示的意思表示即相对人可以直接借由表意人之言语、动作或文字等方式直接了解表意人所欲表达之意思为何。
          o 默示的意思表示无法使相对人直接透过表意人之表示方法了解表意人之意思，而仅能透过特定行为“间接”推知表意人所欲表达之意思。
    * 意思表示依其是否是以直接沟通的方式表达，可分为“对话的意思表示”和“非对话的意思表示”
          o 对话的意思表示，亦即表意人直接以对话之方式作成意思表示，其乃以“直接”沟通的方式使相对人得以了解表意人之意思，至于是透过电话、网络或其他方式皆可。
          o 非对话的意思表示，即表意人非直接以对话的方式表示其意思，而是透过信件、电报...等方式使相对人可以获知其意思表示。

意思表示的瑕疵

意思表示的瑕疵可以再分为“意思与表示不一致”与“意思表示不自由”两种情形
意思与表示不一致

    * 单独虚伪意思表示 (心中保留)

    * 通谋虚伪意思表示

意思表示不自由

    * 诈欺：一方当事人故意告知对方虚假情况，或者故意隐瞒真实情况，诱使对方当事人作出错误意思表示的，可以认定为欺诈行为。

    * 胁迫：以给公民及其亲友的生命健康、荣誉、名誉、财产等造成损失或者以给法人的荣誉、名誉、财产等造成损害为要挟，迫使对方作出违背真实的意思表示的，可以认定为胁迫行为。

意思表示发生效力

就意思表示发生效力的时点，立法例上主要有下列几种：
表示主义

表示主义，或称“表白主义”。即意思表示于表意人完成其表示之行为时即发生效力。
发信主义

发信主义即意思表示于表意人将该意思表示发送出去后即为生效。
了解主义

了解主义，即意思表示须待相对人了解时，使生其效力；在相对人为了解之时，则不生效力。
到达主义

到达主义，或称“达到主义”。即意思表示于其到达相对人之处时，使发生效力。而在此之达到，只要意思表示处于客观上相对人可得支配之范围内即可，而不限于一定要交付到当事人手中，也不论当事人是否阅读与否。依中华民国民法第95条第1项之规定：“非对话而为意思表示者，其意思表示，以通知达到相对人时，发生效力。...”可知，中华民国民法于非对话的意思表示采的是“到达主义”。</pre>
</div>
<div title="我" modifier="Steve" created="200912070810" modified="200912070810" tags="建站" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" changecount="2">
<pre>Logo

&lt;html&gt;
&lt;IMG src=&quot;http://dl.getdropbox.com/u/762096/shou%2Epng&quot;&gt;
&lt;/html&gt;
</pre>
</div>
<div title="我的GTD" modifier="Steve" created="200911100253" modified="200911100257" tags="GTD" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100257">
<pre>前面有三篇介绍[[GTD概念]]、[[GTD方法]]、[[GTD工具]]，全是摘抄，只为了完备。

本文则是自己感受。

首先很遗憾，我的六个高度还没有完全架构起来，也就是最高的人生目标和梦想还比较空虚，本文尽量不用术语。

我的GTD只是用于日常计划，事先安排，提高效率，不作无用功。

把东西排出脑外，这一点非常重要，有什么事情全部写下来就不用刻意去记得，简单说就是放心。
有任何点子全不放过，不管是否有用先记下来再说。

之后的回顾是关键步骤，回顾今日，展望未来。简单说就是处理，安排。

然后就动手去做吧，不过就我个人而言，执行力一直是个大问题。

至于我的工具，[[Treo]]，[[纸笔]]，[[网络工具]]。</pre>
</div>
<div title="推荐著作" modifier="Steve" created="200911111821" modified="200911111822" tags="法学 阅读" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911111822">
<pre>　　推荐几本法学方法论和法律解释学著作[转]
     网上读书园地承猫版不弃，相邀推荐一些[[法律解释]]学著作，我也就厚着脸皮发表一些浅陋心得，欢迎指正。
　　裁判是找法（Rechtsfindung），适用法律至案例事实，以此解决法律问题的过程。这种法律适用的过程，通常表现为逻辑三段论的形式。不过，@@正如拉伦茨指出：“即使认为…法律适用始终是属于逻辑推论过程的”涵摄“的人也必须承认，这种涵摄是以一些单纯的判断为前提，这些判断指出，规范构成要件中的某要素存在其中。”@@
　　所以才说，法律适用仅仅是一种伪装的形式逻辑三段论推理，如果把法律论证视为单纯的三段论作业，这实际上并未觉察到法律适用的“评价”特质。也就是说，@@法律适用的重心不在最终的涵摄，而在于论证和判断案件事实的各项要素是否符合法条构成要件。@@
　　但是这决不是说三段论作业没有价值或者不重要。法律论证中的形式推理的逻辑性和正确性是维护裁判客观公正的一个不可或缺的条件，如果连推理的形式逻辑都可以不必遵守，那么我们很难想象会有怎样一种的裁判结果。但维护推理上的逻辑一致性仅仅是一种基础性的、前提性的工作。
　　在解决法律问题的过程中，除了解决内部推论的逻辑性问题；@@更为重要的是如何解决作为大前提法条和案件事实之间的裂缝或间隙的问题。@@（注：王泽鉴“三个往返”之第一：往返于事实和规范之间；张明楷张氏名言：心中当永远充满正义，目光得不断往返于规范与事实之间。）因为抽象的法条和丰富具体的生活事实之间中有差距，@@如何解释法条、依照法律和社会经验对案件事实作必要的判断，填补的差距和裂缝，这才是法律适用的核心部分。@@在这个过程中涉及到：我们用什么样的方法来获得裁判论证所适用的前提（法源问题），以及如何论证这些前提本身的妥当性。这正是法律解释学要研究的重点。
　　既然需要解决规范的一般性和具体事件的特定性之间的裂缝问题，研究司法判例对于解决[[法律解释]]的难题、发展法律就有着非同寻常的意义了。
　　下面就我非常有限翻阅范围，打肿脸充胖子，推荐几本，还请各位方家补正。
　　一、适合的入门读物不多：
　　比如王泽鉴的[[《法律思维与民法实例》]]， 虽然非常好，但是却是举的都是台湾的例子；引用的也是民国民法，不免有些隔靴搔痒，很难让初学者依葫芦画瓢。
　　不过所幸，德国技术合作中国法律改革咨询项目出的一套中国法律比较法案例丛书可作补充。重点可以看一下其中的一本《中华人民共和国合同法比较分析》葛毅主编，出版社：中国政法大学出版社  出版日期：2001。完全是德国套路，但是分析中国法分析的却头头是道，这难免令我们这些学习本国法多年的人，感到汗颜，对于法条的熟知程度竟不如老外。
　　王亚新等著《法学进阶之路》这本新书，则是汇编了国内的名家论述法学方法论的进阶之路，反映了我们当前主流学界的认知，也适合初学者细读。
　　其他的补充读物如梁慧星的[[《裁判的方法》]]；杨立新《民事裁判方法》等二、进阶阶段：
　　首推的当然是拉伦茨的[[《法学方法论》]]；很多人都有畏难的情绪，读不下去。但是耐下性子，慢慢的读，读出味道了，却别有一番乐趣。其中中文版的第一章现代方法上的论辩，初学者可以跳过；读完全书，有兴趣和余力的，不妨再看。
　　区分和类推在裁判中有相当重要的作用，考夫曼的《类推与事物本质》，（学林文化事业有限公司1999年版 ）值得仔细研读。
　　解释法律主要涉及对规则和原则的认识和运用；哈特的《法律的概念》和德沃金的《法律帝国》对于法律解释者来讲无疑意义非凡。
　　季卫东先生的关于法律解释学的几篇论文也具有非常重要的价值，“法律解释的真谛”；“中国司法的思维方法及文化特征”等。
　　如果侧重实务方面的考虑可以看看孔祥俊的《法律解释方法与判解研究》、《司法理念与裁判方法》。
　　三、进一步的研读请参阅维基百科相关词条重要者摘录如下：
请参阅维基百科相关词条http://de.wikipedia.org/wiki/Juristische_Methodenlehre
http://de.wikipedia.org/wiki/Juristische_Dialektik
重要者摘录如下：
1.    Hans-Martin Pawlowski, Methodenlehre für Juristen, 3. Aufl., Heidelberg 1999.
2.    Robert Alexy: Theorie der juristischen Argumentation, 3. Auflage, Suhrkamp, Frankfurt a.M. 1996, Nachdruck 2001. 延伸读物 Law, Rights and Discourse: The Legal Philosophy of Robert Alexy (Legal Theory Today)http://gigapedia.com/items:links?id=207713
3.    Karl Engisch, Logische Studien zur Gesetzesanwendung, 3. Aufl., Heidelberg 1963.
4.    Karl Engisch, Einführung in das juristische Denken, 10. Aufl., Stuttgart 2005.
5.    Friedrich Müller/Ralph Christensen, Juristische Methodik, Bd. 1, Grundlagen, 8. Aufl., Berlin 2002; Bd. 2, Europarecht, 2003.
6. Wank, Rolf, Die Auslegung von Gesetzen, 2. Aufl, 2001 
7. Zippelius, Reinhod, Juristische Methodenlehre, 9. Aufl, 2005
8. Wolfgang Gast Juristische Rhetorik (Gebundene Ausgabe) Müller (C.F.Jur.), Heidelberg; Auflage: 4., neu bearb. u. erw. A. (1. März 2006)


另外cuplav 兄开的书单，也非常有价值，我这里转录如下：


[德]卡尔•拉伦茨著：《法学方法论》，陈爱娥译，商务印书馆2003年版。（经典著作）
[德]考夫曼、哈斯默尔主编：《当代法哲学和法律理论导论》，郑永流译，法律出版社2004年版。
[德]阿列克西著：《法律论证理论》，舒国滢译，中国法制出版社2002年版。
[德]考夫曼著：《法律哲学》，刘幸义等译，法律出版社2004年版。
黄茂荣著：《法学方法与现代民法》，中国政法大学出版社2001年版。（法律有个新版）
林立著：《法学方法论与德沃金》，中国政法大学出版社2002 年版。（写的很通俗易懂）
考夫曼著：《类推与事物本质》，吴从周译，学林文化事业有限公司1999年版，（书不太好找，园地里有一丁兄做的一个版本，http://www.readfree.net/bbs/read ... 2%CE%EF%B1%BE%D6%CA，我就是因为这本书才来到园地的）
黄建輝著：《法律闡釋論》， 新學林出版股份有限公司2000年版（也不好找）
还可以看看舒国滢老师和郑永流老师翻译的、写作的一些文章，以及《法哲学与法社会学论丛  》

对方法论的形成史有兴趣的，还可以看
[德]弗里德里希•卡尔•冯•萨维尼、雅各布•格林著：《萨维尼法学方法论讲义与格林笔记》，杨代雄译，法律出版社2008年版。
[德]佛朗茨•维亚科尔著：《近代私法史——以德意志的发展为观察重点》，陈爱娥、黄建辉译，上海三联书店2006年版。
[德]米歇尔•施托莱斯著：《德国公法史(1800 -1914)——国家法学说和行政学》，雷勇译，法律出版社2007年版。
　　
　　相关评论作者： hong 发布日期强！就一个字！G兄真的很强啊！
　　收获很大——感谢！
　　说几句补充的话，不知道对不对？
　　如果说读卡尔·拉伦茨的《法学方法论》有难度，看看杨仁寿老师的《法学方法论》也有些帮助吧。
　　另外关于法律解释学方面，是不是还可以通过具体内容反观理论，以便于深入理解“解释法律”之内涵？如梁慧星老师的《民法解释学》从1995年初版，到现在也出了几版，特别是该书从民法解释学的沿革到罗马、中世纪以来及各国的情况作了实证概括，这对于理解纯粹的法律解释或本质与真谛等概念更便利呢？
　　作者： 寒江 发布日期的书单很有价值啊，拉伦茨的《法学方法论》从第二张开始读吧，很多人先读第一章信心都被打击完了，其实没有那么难的，呵呵黄茂荣的那本读起来感觉比拉伦茨的还要晦涩些，我觉得作者： 寒江 发布日期季卫东是真正的顶尖高手，张志铭，梁治平的一些文章可以拿来读读，关于中国问题的作者： martinu 发布日期大顶！ G兄和C兄的书单真好，以后又可以按图索骥了。
　　讲到拉伦兹的那本书，我就是倒在第一章上的，再也没勇气读下去，看来什么时候试试从第二章开始农村包围城市。
　　有关法律解释，梁治平在1998年主编过一本《法律解释问题》的书，不知大家觉得如何？另外，有关我国法律解释现状的研究，各位学兄有没有可推荐的书。我只知道侯猛的一本书《中国最高人民法院研究——以司法的影响力切入》算是与这个有点关系，但是还没买来看过。
　　作者： gjqdzzh 发布日期引用第1楼hong于2009-03-20 16:11发表的说几句补充的话，不知道对不对？
　　如果说读卡尔·拉伦茨的《法学方法论》有难度，看看杨仁寿老师的《法学方法论》也有些帮助吧。另外关于法律解释学方面，是不是还可以通过具体内容反观理论，以便于深入理解“解释法律”之内涵？如梁慧星老师的《民法解释学》从1995年初版，到现在也出了几版，特别是该书从民法解释学的沿革到罗马、中世纪以来及各国的情况作了实证概括，这对于理解纯粹的法律解释或本质与真谛等概念更便利呢？
　　我这么点货色跑出来贻笑大方了。泓兄纵横文史哲，旁涉法律、经济诸学科，是公认的学士的师傅，才是真正的强。
　　杨仁寿的[[《法学方法论》]]文字浅显，深入浅出是很好的入门读物。梁慧星先生的《民法解释学》，似乎是大陆最早的法学方法论著作，梁先生奠基、启蒙之功，不可磨灭。我只是在当年粗略翻看过初版，印象中前半卷涉及解释学的一般理论及历史发展问题，后半卷则是论述法律解释的方法，初版并不完美，结构和论述还有些粗糙。但是不知道再版情况，啥时候也找来再学习一下。
　　作者： gjqdzzh 发布日期引用第4楼martinu于2009-03-20 19:39发表的有关法律解释，梁治平在1998年主编过一本《法律解释问题》的书，不知大家觉得如何？
　　法律解释学和法学方法论都是颇具包容度的概念，学习方法论，似乎大多数法律人的任务均应定位于在学习狭义上的法学方法论，即教义学的方法上。但法律学本身是一门尴尬的学科，一方面有严重的封闭性，甚至是闭门造车的倾向，并且这种自我封闭和独立性对于法治社会又有非常重要的价值了；另外一方面，近代以来概念法学有暴露出很多局限性；这种局限性借助于法教义学本身无法克服；所以才会产生研究法学的多种方法，社会学、历史学、经济学的方法等等，其中包括了梁治平的文化解释的方法、苏力们的法社会学和邓正来的某某法等。但是它们对于法教义学有多少价值，就目前的中国现状来看，是令人怀疑的。一定程度上还制造了很多负面的干扰，让人产生时代的错觉，甚至干扰了正常的法律教义学的发展。好在学界似乎逐渐在廓清迷雾，慢慢认识到这些方法仅仅是辅助性的，不会、也不应该成为法学研究的主流方法。
　　引用第4楼martinu于2009-03-20 19:39发表的另外，有关我国法律解释现状的研究，各位学兄有没有可推荐的书。我只知道侯猛的一本书《中国最高人民法院研究——以司法的影响力切入》算是与这个有点关系，但是还没买来看过。
　　宏观层面，我也没看到什么好的成果，还请大家多推荐推荐。但是我国法律解释现状的研究，微观层面，可以看看判例研究；但是遗憾的是大多数判例研究，水平不敢恭维，而且也远远没有成为风尚。
　　作者： hong 发布日期兄着实谦逊！泓哪里敢“纵横文史哲……”今天就坦白下：本人所谓纵横文史哲不过是“票友”真真的票友……法学、经济学等都是正在学习中滴，小小小学生而已，真的！为了下次还有勇气来这个栏目，非要给自己壮壮胆子的话，只能拉出与啥啥啥的一点点关联啦（反正吹牛也不上税）！
　　另外，我提到杨老师的《法学方法论》，正如G兄所说的，比较适合入门；而谈梁老师的《民法解释学》，则希望提供一个学习较深的理论性著作（拉伦茨）的另一个入手点——总之，G兄应当能够看出来，我的发言均属“入门”前的小小小学生之思量！
　　猫猫来这里之后，真的很有起色，赞一个！！
　　作者： josephe 发布日期这些都是俺这个大老粗看不懂的。俺还是找些图片看看比较好。
　　作者： tongxuke 发布日期好久没在“法律之窗”里看到这么好的文章了，非常不错。其实我个人理解，法学方法论知识的把握的多少是对不论你从事的是法律实务还是研究都是必不可少的。我也是在从事法律工作以后才有此体会的。因为有许多案件需要你结条和案件本身的特点来综合分析。盲目、机械的照搬法条只会让你左右为难、无所适从。所以说，学习法学方法是一种基础性的要求。
　　请教：gjqdzzh兄，葛毅主编的《中华人民共和国合同法比较分析》，能否在此发布，让我们学习学习。先谢谢了。
　　作者： littlekid 发布日期诸兄推荐的书单似乎是以德国传统法学方法论为主，其中的大多数译作，小弟也曾读过些许。发源自德国民法的方法论具有相当的系统性，体系庞大，蔚为大观，可谓是当下法学方法领域内的主流理论。这是一种典型的德国式理论，囊括万象，无所不包。任何法律学习者，站在这样的理论城堡面前，都会有望而生畏之感。说实话，我就曾被吓到过，而且还不只一次两次。
　　爱过怕过也崇拜多，借机抒发下胸中块垒，恰好也向诸位留德或并非留德但也学养同样深厚的方家请教：
　　这套理论在本质上来说像极了“工具箱”，箱子里面里面装着各色螺丝刀、起子、锯子、扳手，只要你能想到的工具，箱子里头都有。可问题也是从工具箱这个隐喻出来的，工具箱不可能告诉你该怎么做一条板凳，更不能告诉你怎样的板凳是好的板凳。假设我们要做一条凳子在旅途中使用，既要保证重量适宜、便于携带，又要保证用料扎实、坚固耐用。首先，我们要有一个动手能力很强的板凳制作者，他知道怎么做板凳，这是工具不知道的。其次，板凳制作者可以做一条轻便的板凳，也可以做一条结实的板凳，但是工具却没法告诉我们怎样的板凳适合长途旅行。德国传统的方法论也是一样，它是工具主义的：它准备了精致的工具，也仅仅准备了精致的工具。
　　常见的德国式方法论解释方法有合宪解释、文义解释、历史解释（原意解释）、体系解释、漏洞补充等等。即使不懂法学方法论的人也很容易看到的一个问题是，分类的基础在哪里？比如合宪解释和体系解释，他们是同一范畴的概念吗？如果是同一范畴的话，这个范畴是什么呢？接下去，还会有更多的疑惑：比如，文义解释能够和历史解释（原意解释）共存吗？文义解释的解释原则是探究语词的字面含义（语义学意义，semantic meaning），历史解释则诉诸立法者立法原意（历史上“立法者”的心智状态，mental states）。这两种解释策略表面上看起来是不能相容的，如果立法者原意说了算，就要一直算数；如果文意说了算，也要一直算数。
　　我们可以想象用这两种策略读一本小说，我不妨将它们称为幼稚读者读法和熟练读者读法：
　　幼稚读者读法不去找作者的创作背景和创作动机，就把文本的阅读当成消磨时间的方法，她只看到作者在字面上呈现的小说情节并且直觉地限制在字面的内容中；熟练读者的读法（比如布鲁诺兄，致敬！）就不一样了，她会找出作者的创作背景和创作动机，并以此为指导来阅读文本，挖掘出文本背后作者深层次的意图。读者们用这两种读法阅读同一本小说会有两种可能，最简单的可能性是两种读法读出来的意涵是一样的，那自然没有争议；可问题是，万一两种读法读出来的东西大相径庭，又该怎么办？法学方法论就是来解决这个问题的。针对这第二种可能性，我们假设这两种读法读这本书的每一章都会有分歧产生。问题就出来了：难道读者可以在第一章用幼稚读者读法，而在第二章用熟练读者读法，并且一直变着读法子读完整本书？这种阅读方法是完全不能想象，并且在逻辑上也是讲不通的。我们怎么能在同一个文本之中一下诉诸一种解释策略，一会诉诸另一种解释策略，并且这两种解释还不能相容呢？小说真有作者，可法律的作者是谁，是智力运作能力低下的 People Big Law Work Committee吗？小说无所谓权威的读法，可能两种法子混着读也是一种享受，但法律需要一种权威的阅读策略，混着读显然就不行了。
　　再退一步，假设我们坚持贯彻这个“精神分裂式”的读法，并且用更深层次的指导原则来指引解读策略的选择。那么是什么在左右着我们读法的选择，是文本吗？明显不是，因为文本本身是被决定的对象，它的含义随着解读策略的变化而变化，又怎么去决定别人？一种策略就是设定一个更为基础的方法，我们称为“元方法”。元方法很可能就是拉伦兹非常喜欢讲的“评价法学”，无奈这个术语从来没有被清晰界定过（囿于语言能力所限，这个说法可能很有问题，但中文世界出版的作品直到现在都没能让我弄明白究竟啥子是“评价法学”）。既称“评价”，则必然是规范理论，伦理学上主要规范理论无外乎道义论、美德论和结果论。前两者似乎可以排除，因此以自己的粗浅理解，评价法学可能——或者其最佳形式——是某种结果论（功利主义）。纯粹瞎猜，这一点还请古卷、martinu等熟悉德文文献的诸兄多多指教。
　　到这里先打住，如果我们不持有批判的态度（参考如歌老师的善意原则），我们可以抽离出两种看待德国法学方法论的观点：
　　第一点称为“分离论”。这种观点认为方法论本身是且仅仅是一套工具，这套工具可以和任何一套规范理论相衔接。
　　如果我们这样理解方法论，那么“精神分裂式”的解释策略是它所应当竭力避免的。我们确实可以在大脑中想象一套完美的、融贯的方法，可以与任何规范性理论搭配。就像上文指出的，传统理论在这上面还有很多路要走，至少文义解释和愿意解释就是个很大的障碍。
　　第二点称为“结合论”。这种观点则认为方法论只能和一种适当的规范理论（元方法）相结合，在这里，就是所谓的“评价法学”。方法论必须要和某种规范理论融为一炉，方法可以是工具的，但它的使用必须受到某一理论目标的指导。
　　结合论在直觉上似乎更加有说服力一些，因为法律本来就是规范性的学科。这种解读的优点是能够避免前文精神分裂症困扰，但遗憾的是，在传统方法论的理论中， “评价法学”（我所理解的）似乎并不能很好地与“方法论”结合在一起——至少我没能在中文翻译的文献中看到令人信服的论证。传统的方法论似乎也意识到这一点，它们引入许多方法背后的规范性要求，比如合宪解释体现了尊重人类的基本权利的要求，文义解释则是考虑到法律指引社会生活的确定性，但问题是我们没有发现有哪个理论将这些规范性要求整合到一起。或许，评价法学可以简单地以“利益衡量”一语带过。但“利益衡量”听上去很玄妙，玄妙的东西往往很模糊（比如国产马牌辩证法，参考如歌老师关于哲学大杀器的妙文），也就帮不上方法论什么忙。人家本来就是各种考量纠结在一起，搞不出个一致标准来，法哲学家们不给出一个天平称就已经够失职了，还让人家继续衡量，这不坑人嘛。
　　不管以何种同情的观点来看，传统的方法论似乎都有一定的问题。古卷兄的这个论题正是绝佳的机会，特在这向诸位大兄请教。最大的可能是我严重误读了德国传统方法论，还请诸兄多多批评指正！

注：
王泽鉴在课上说，他和江泽民，名字有一个字一样，理论也有部分同名。他的三个往返：往返于事实和规范之间，往返于法条、教科书与案例之间、往返于本国法与外国法（立法例和案例）之间。完后他说，江主席的三个代表是代表什么？代表正义吗？</pre>
</div>
<div title="插件" modifier="Steve" created="200911071752" modified="200911071832" tags="测试" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911071832">
<pre>测试timeline
什么效果啊？

原来是这样
&lt;&lt;tCalendar [year [month [count]]]&gt;&gt;
&lt;&lt;tCalendar [last [n] | next [n] {year(s) | month(s)}]&gt;&gt;
eg,
&lt;&lt;tCalendar&gt;&gt;,
&lt;&lt;tCalendar 2007 10 3&gt;&gt;,
&lt;&lt;tCalendar thisyear&gt;&gt;,
&lt;&lt;tCalendar last year&gt;&gt;,
&lt;&lt;tCalendar next 4 months&gt;&gt;
&lt;&lt;tCalendar lastModified&gt;&gt;</pre>
</div>
<div title="无权代理" modifier="Steve" created="200911080721" modified="200911151342" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911151342">
<pre>|!概念|
无权代理是指无[[代理权]]人以被代理人的名义而为的[[法律行为]]。
包括广义的无权代理和狭义的无权代理。

狭义的无权代理是指欠缺代理权的代理行为。而欠缺代理权的原因可能是：
#@@自始即未获得授权@@；
#@@超越代理权@@；
#@@代理权终止后的行为（代理权消灭）@@。
在以上几种情况下，都可能会导致代理人所做出的代理行为成为无权代理，即自始无代理权的无权代理，超越代理权的无权代理，代理权消灭的无权代理。

广义的无权代理还包括[[表见代理]]。在@@超越代理权@@和@@代理权终止后的行为@@的情况下，则容易产生[[表见代理]]

本文仅讨论狭义无权代理，如无特殊说明下文无权代理即指狭义无权代理。

|!法条|
[[民法通则]]
第六十六条
@@没有代理权、超越代理权或者代理权终止后的行为，只有经过被代理人的追认，被代理人才承担民事责任。@@未经追认的行为，由行为人承担民事责任。本人知道他人以本人名义实施民事行为而不作否认表示的，视为同意。
代理人不履行职责而给被代理人造成损害的，应当承担民事责任。
代理人和第三人串通，损害被代理人的利益的，由代理人和第三人负连带责任。
第三人知道行为人没有代理权、超越代理权或者代理权已终止还与行为人实施民事行为给他人造成损害的，由第三人和行为人负连带责任。

[[合同法]]
第四十八条
@@行为人没有代理权、超越代理权或者代理权终止后以被代理人名义订立的合同，未经被代理人追认，对被代理人不发生效力，由行为人承担责任。@@
相对人可以催告被代理人在一个月内予以追认。被代理人未作表示的，视为拒绝追认。合同被追认之前，善意相对人有撤销的权利。撤销应当以通知的方式作出。

注：行为人=代理人，第三人=相对人，本人=被代理人

|!构成要件|
#行为人无[[代理权]]
#以本人的名义
#须为[[法律行为]]

|!法律效果|
!论述方式1
!!1.效力未定
行为人所为代理行为非经本人承认，@@对本人@@不发生效力。被代理人能自由选择该无权代理行为是否对自己产生效力，即追认权。
行为人明知行为人以本人名义实施民事行为而不作出否认表示，视为承认代理行为，其效力归属于本人。
第三人得定相当期限（合同法48条，一个月），向本人催告确认是否承认，逾期不承认者，视为否认代理行为。
善意行为人得在本人做出追认之前，撤销无权代理人之代理行为。

催告vs追认
追认vs撤销（善意第三人）
默示承认vs默示拒绝

追认权是一种[[形成权]]，仅凭权利人单方意思表示就能发生权利人和相对人之间的法律关系变动，因此需加以时间限制，即[[除斥期间]]。合同法第48条第2款规定，相对可催告被代理人在一个月之内予以追认，被代理人未作出表示的，视为拒绝承认。

&lt;&lt;&lt;
狭义的无权代理乃一种效力未定的法律行为。所谓效力未定是指法律行为成立后并不能发生符合当事人意思表示的效力。而是处于尚末确定之中，须以行为之相对人或利害关系人的补充行为才能确定其有效或无效。在上述狭义无权代理的三种类型中，代理人是以自己的意思表示，以被代理人的名义与相对人为民事法律行为，从而为被代理人设定权利和义务。对于被代理人出于代理行为之实施与其意思表示全无关系.因此被代理人无须为无代理权人的行为承担任何责任；于相对人之善意者，由于他对不知代理人无代理权并无过错，法律为平衡其与被代理人之间的利益。也赋子他可撤销与无代理权人所实施的民事法律行为的权利从而得以免予承担代理行为的法律责任。但是，出于代理行为未必一定对被代理人或相对人不利，所以被代理人或相对人还得以自己的意思表示补充确定该代理行为为有效，从而承担代理行为的法律后果。为此，代理制度规定了被代理人的追认权和拒绝权以及相对人的撤回权和催告权，从而可以使不确定的法律关系确定下来，使代理行为效力归于有效或无效，以保护被代理人或相对人的合法权益。
第一，被代理人的追认权和拒绝权。被代理人的追认是单方法律行为，实际上有事后代理权授子的性质，因此，它既可以由被代理人实施，也可以由被代理人授权代理人为之。被代理人的追认可采各种形式，既可以是明示的，也可是默示的。明示是指被代理人向无代理权的行为人或相对人以公告方式追认的意思表示。默示是指被代理人接受第三人履行义务，或接受无权代理人移交实施无权代理行为的利益，或知道他人以本人名义实施民事行为而不作否认表示的情形。被代理人的追认应向第三人为之，也可以向无权代理人为之，还可以以公告的方式为之。但被代理人的追认须是对无权代理人的行为的全部承认。如果行为人实施了多项无权代理行为，被代理人可以追认其中的一项或数项，但对任一项的追认都应是概括地追认其权利和义务的全部，而不能只追认行为所带来的利益而不追认行为所产生的义务。
被代理人只对无权代理人与相对人实施的行为的一部分承认，或者加以变更而承认的，其承认均无效。
第二，相对人的催告权与撤回权。无权代理行为在未被被代理人追认前，相对人可以请求被代理人做出是否追认的明确表示，也可以撤回自己与无权代理人所为的意思表示。即相对人享有催告权或撤回权。相对人行使催告权或撤销权的目的是使无权代理行为的不确定状态早日确定下来。第三人行使催告权应向被代理人为之，行使撤回权则应向无权代理人或被代理人为之。相对人撤回的意思表示必须在被代理人追认的意思表示到达前为之。如果被代理人已经追认，相对人的撤回权即归于消灭；如果被代理人已经否认，这时无权代理行为已经注定不能对被代理人发生效力，相对人的撤回权也当然归于消灭。同时，撤回权的享有必须以相对人善意且无过失为前提，即不知行为人无代理权。如果相对人已知代理人无代理权仍与其为民事法律行为的，不能发生撤回的法律效力。
&lt;&lt;&lt;

!!2.无权代理人之责任
无权代理人之代理行为未得到本人追认而造成相对人损害的，对善意相对人，不论是否有过失，承担赔偿责任。相对人得向代理人主张[[履行利益]]和[[信赖利益]]，但履行利益不得大于信赖利益。

&lt;&lt;&lt;
关于无权代理人民事责任的内容，主要有两种立法例:@@一是选择责任，即相对人得依其选择，请求无权代理人履行或要求无权代理人赔偿损害，属于一种选择之债。德国民法、日本民法等均采取此立法例；二是赔偿责任，即无权代理人仅负损害赔偿责任。瑞士民法、我国台湾民法等采取此立法例。@@我国民法通则第六十六条只是规定“由行为人承担民事责任”，而没有具体规定民事责任的内容。对此，学者的解释各有不同。主要有以下几种观点:第一种主张认为，应赋予相对人选择的权利，或要求履行，或请求赔偿。第二种主张认为，相对人可以依不同情况作出选择：其一是相对人仅要求赔偿实际损失；其二是若无权代理行为没有给相对人造成任何实际损失，则相对人可以要求履行合同，也可要求行为人承担违约责任；其三是相对人同时请求履行合同和赔偿损失。第三种主张认为，无权代理人的民事责任应包括履行债务和损害赔偿并视其主观状态而加以区别。即无权代理人为善意的，相对人只能请求损害赔偿。无权代理人为恶意的，相对人既可以请求履行债务，又可以请求损害赔偿。第四种主张认为，无权代理人只负赔偿责任。如果无权代理行为没有给相对人造成损害，就无从产生行为人的责任。其实前三种观点都是选择责任主张，只是选择范围的大小不同而已。选择责任说固然有利于相对人，但缺乏理论根据。@@因为无权代理人并不是法律关系的当事人，没有承担履行责任的主体资格。因此，作为一种法定责任，无权代理人的民事责任应以赔偿责任为宜。@@
无权代理人的责任为赔偿责任，那么，赔偿范围应如何确定呢?即，无权代理人须赔偿相对人因无权代理行为有效而可得的利益(即[[履行利益]])，还是只须赔偿相对人相信代理人有代理权而受损失的利益(即[[信赖利益]])?对此，各国立法及学说不尽一致。《德国民法典》第179条第(2)款规定:“代理人不知自己为无权代理时，仅对因信其有代理权而受损害的相对人负赔偿责任，但赔偿额不得超过相对人在契约有效时可得到的利益。”从这一规定可以看出，德国民法是以无权代理人为善意或恶意来确定无权代理人的赔偿责任范围的。即善意的无权代理人仅负不超过履行利益的信赖利益的损害赔偿责任，恶意的无权代理人则应负履行利益的损害赔偿责任。《瑞士债务法》以无权代理人有无过失而定其赔偿范围。即无过失者仅就因契约失效所生之损害负赔偿责任。如有过失，法官认为公平时，得命为其他损害赔偿。我国台湾民法典没有具体规定无权代理人的赔偿责任范围，学者间存在着三种观点:第一种观点认为，应分别情况予以分别决定。@@即无权代理人为善意的，则仅负信赖利益的赔偿责任，其数额不得大于履行利益。无权代理人为恶意的，则应负履行利益的赔偿责任；@@第二观点认为，无权代理人的赔偿责任应以信赖利益为限；第三种观点认为，无权代理人应负履行利益的赔偿责任。我国民法通则对无权代理人的赔偿责任的范围也没有具体规定。本文认为，确定无权代理人责任的赔偿范围，不仅要从保护相对人利益角度出发，而且应考虑到无权代理人的利益。因此，以无权代理人的主观状态来确定赔偿范围，能够比较公平地协调无权代理人与相对人的利益，是可取的。
&lt;&lt;&lt;

代理人行为不违背本人明示，却不被本人承认，代理人得依无因管理请求权向本人请求损害赔偿。
代理人给本人造成损害的，行为人得向代理人请求损害赔偿。
无权代理效果不归属于本人，如何损害本人利益。@@bgcolor(yellow):Question@@
解答：
　　关于无因管理的规定主张其权利。例如甲外出探亲期间，其住宅遭台风毁损，乙以甲之名义雇丙修缮，设甲不承认此项代理行为时，若乙管理事务利于甲，并不违反甲明示或可得推知之意思者，乙得依第176条规定，向甲请求清偿其对丙所负拒的损害赔偿责任。本人承认无权代理行为时，本人与代理人间的权利义务@@依其内部关系@@定之。例如甲建筑公司的业务专员乙，逾越其授权范围，与客户订立买卖契约，甲@@为维持信用而承认其法律行为@@时，甲就因此所受损害，得依关于债务不履行的规定，向乙请求损害赔偿。

!!3.第三人之责任
a.第三人明知行为人无代理权而与行为人为民事行为对他人造成损失的，双方承担连带责任。
b.第三人恶意串通行为人，损害被代理人利益的，双方承担连带责任。
注：这些看起来都不像无权代理，而像滥用代理权。只是顺便和物权代理写在同一个法条里了……

!论述方式2
!!本人与相对人之间
##本人的承认权
##相对人的催告权
##相对人的撤销权

!!本人与代理人之间
本人依内部关系向代理人提出损害赔偿。

!!相对人与代理人之间
行为人选择让代理人履行或赔偿损失@@bgcolor(yellow):Question@@
解答：
理论上可以选择，但一般来说，代理人履行有困难，通常采赔偿损失。

@@台湾地区立法例@@
代理人与第三人（相对人）间的法律关系，乃无代理权人对相对人负损害赔偿责任的问题。第110条规定：“无代理权人。以他人之代理人名义所为之法律行为，对于善意之相对人，负损害赔偿之责。”兹就其构成要件、法律效果、消灭时效、举证责任，分别说明如下：
一、构成要件及法律性质。
第110条规定无代理权人责任，其成立要件为：（1）须无代理权人以本人名义而为法律行为，而该法律行为因本人拒绝承认〔或视为拒绝承认）确定不生效力。相对人于本人承认前，撤回其与无代理权人所为之法律行为时，无第110条的适用，盖相对人既已撤回，不使代理行为发生效力，自无保护的必要。（2）须相对人为善意，有无过失，在所不问。第110条所定无代理权人责任，不以无代理权人不知其代理权有无过失为要件。1967年台上字第305号判例谓：“无权代理人责任之法律上根据如何，见解不一，而依通说，无权代理人之责任，系直接基于民法之规定而发生之特别责任，并不以无权代理人有故意或过失为其要件，系属于所谓原因责任、结果责任或无过失责任之一种，而非基于侵权行为之损害贻偿。”性质上属于法定担保责任。
二、法律效果。
1）损害赔偿。
@@第110条所称损害赔偿，究指何而言，解释上可有四种见解：@@
1.相对人仅得请求赔偿因该法律行为有效可取得的利益（履行利益=积极利益）。
2.相对人仅得请求赔偿因信其有代理权而损失的利益（信赖利益=消极利益）。
@@3.无论消极利益或积极利益，相对人均得主张；但信赖利益的请求，不得大于履行利益。@@
@@4.无代理权人如于行为时不知其无代理权者，仅负赔偿信赖利益的损害赔偿〔其数额不得大于履行利益），否则应负赔偿履行利益之责任。@@
就现行法解释而言，以第三说较值赞同，实务上亦采之（最近见解参阅1996年度台上字第2072号关于违约金的判决）。将损害赔偿仅限于信赖利益，不足保护相对人。在无权代理，其代理行为虽不生效力，但不能因此径认仅能请求信赖利益，此观诸各国立法例即可知之。第四说在比较法上确有所据。代理人非因过失不知其代理权的欠缺，例如授权者为精神病人，系无行为能力人，妄以授权书给与代理人，而代理人不知其为无行为能力时，使代理人负履行利益的赔偿责任，诚属严苛，在立法论上，应使其仅负信赖利益的损害赔偿，较为合理。惟此实已超过第110条的解释范畴，而进入法律创造的阶段。
2）消灭时效。
关于第110条损害赔偿请求权的消灭时效，1967年台上字第305号判例认为，无权代理人之责任系直接基于民法之规定而发生之特别责任，而非基于侵权行为之损害赔偿，“是项请求权之消灭时效，在”民法“既无特别规定，则以第125条第1项所定15年期间内应得行使，但无第197条第1项短期时效之适用。”
“最高法院”否认第197条第1项短期时效的适用，见解正确，实值赞同。另一种思考方向系认关于此项损害赔偿请求权，不必一概适用第125条规定，而应依无代理权人所为法律行为（尤其是契约）有效成立时，其履行请求权的时效期间定之。例如甲有代理权限，而以乙之名义向丙租屋，该代理行为有效成立时，丙对乙租金请求权的时效期间为5年，关于无权代理损害赔偿请求权的消灭时效，似不能以民法无特别规定为理由，径适用第125条所定15年的长期时效期间。依第126条规定定其时效期间，较能贯彻民法设短期时效之规范目的。无论采何见解，此项消灭时效期间，均应自本人对无权代理行为拒绝承认时起算。
3）举证责任。相对人依第110条规定，请求损害赔偿时。须对代理人系无代理权，以本人之代理人名义为法律行为，以及本人拒绝承认，负举证责任。至于相对人非属善意，则由无权代理人负举证责任。
注：
相对人举证：无代理权、本人名义、拒绝承认；
相对人举证：相对人非属善意。

|!法律解释|
1.无[[代理权]]是指行为人自始没有代理权、代理行为无效或被撤销、代理行为超越代理范围或代理权消灭。

2.以本人名义是指代理人表明自己的行为效果归属于被代理人。

3.[[法律行为]]是指具备完全民事行为能力行为人，根据真实意思表示在私法上产生一定的法律效果。

|!案例|

1.某甲住高雄，考上台北某大学法律系，即函请表兄某乙，代租房屋，乙以甲的名义向丙租屋，租期1年，租金每月1万元。丙支出介绍费2000元，并拒绝他人每月1.2万元租屋的要约。甲到台北后发现租屋住处不适读书。甲及乙乃请教就读法律系的朋友某丁，并告以甲其仅18岁，乙不知其事。试问；某丁应如何提供法律意见？
解答：
乙为善意的无权代理人，其无权代理行为自始无效，给第三人丙造成损失，应赔偿其信赖利益损失，为2000元。
那甲就完全不用赔偿吗？连带一下吧。@@bgcolor(yellow):Question@@

2.某甲公司非以保证为业务，该负责人某乙以法定代理人的资格保证丙向丁的借款。试问：(1)此项保证的效力如何?(2)丁得向乙主张何种权利？

　　①甲授与代理权给乙，向丙购买某车，其后发现甲为禁治产人。②甲向丙表示，授权于乙向其租屋。其后甲对乙为代理权的撤回，乙仍以甲的名义，与善意的丙订立租赁契约。③甲将身份证及印章交给乙，办理户籍迁移。乙凭该证件及印章以甲的名义与丙订立保证契约，担保乙的债务。

|!比较|

狭义无权代理和表见代理、无因管理、无权处分的区别

（一）狭义无权代理和表见代理。
在民法上通常将无权代理区分为两类，即狭义无权代理和表见代理，在这两种情况下，代理人可能都不具有代理权。但表见代理是指代理人虽无合法代理权，在其实施代理行为时，如果善意的相对人有合法的理由相信其有合法的代理权并与其从事法律行为的，则该法律行为的效果应由被代理人承担。从法律效果而言，表见代理和有权代理是相同的。但在狭义无权代理情况下，代理人完全不具有代理权，而在其实施代理行为中善意的第三人又不可能相信其具有代理权，因此不能强制被代理人承担责任，只能由被代理人基于自身利益的考虑决定是否承认该行为的效果。可见表见代理与狭义无权代理在性质上是根本不同的。

（二）狭义无权代理和无因管理
所谓无因管理是指没有法定的和约定的义务，为避免他人利益受损失而进行管理或服务的行为。在实践中，常常会发生此种情况，即某人发现他人的事务迫切需要管理，为了维护他人的利益，在未取得他人委托授权的情况下，而主动帮助他人代为管理某些事务或从事一定的法律行为。但是无权代理行为不可混同于无因管理行为，因为无权代理人实施的是关涉他人的法律行为；而无因管理人所实施的，是关涉他人的事实行为。无因管理是一种助人为乐的合法行为，而狭义的无权代理行为则是一种不合法的代理行为，它在很多情况下都会给他人造成损害。

（三）狭义无权代理和无权处分
所谓无权处分行为，是指无处分权人为处分他人财产权利而订立的合同。狭义的无权代理与无权处分行为一样，都是指未获得授权而从事某种行为，都属于效力待定的行为。然而无权代理和无权处分毕竟是两种性质不同的民事行为。一方面，无权代理是指代理人以被代理人的名义实施民事行为，而无权处分则是指无权处分人以自己的名义实施民事行为，另一方面，在无权处分的情况下，相对人如果是善意的，则可适用善意取得制度。如无权处分人无权处分他人的动产时，如果受让人取得该动产是出于善意，则可以依法取得该动产的权利。
|!其他|

|无权代理的类推适用|
无权代表、无权使用等，待以后补充。

|维基百科|
无权代理
维基百科，自由的百科全书
跳转到： 导航, 搜索

无权代理乃是指无代理权人以被代理人之名义而做出的法律行为。无权代理主要有广义及狭义之分，广义的无权代理包含了“表见代理”以及“狭义的无权代理”。
目录
[隐藏]

    * 1 狭义的无权代理
          o 1.1 成立要件
          o 1.2 法律效果
                + 1.2.1 本人的承认权
                + 1.2.2 相对人的催告权
                + 1.2.3 相对人的撤回权
    * 2 表见代理
          o 2.1 代理权继续存在的表见代理
                + 2.1.1 构成要件
                + 2.1.2 法律效果
          o 2.2 代理权授与的表见代理
                + 2.2.1 构成要件
                + 2.2.2 法律效果
    * 3 无权代理人的赔偿责任
          o 3.1 构成要件
          o 3.2 法律效果
          o 3.3 例外
    * 4 参考
    * 5 相关条目

[编辑] 狭义的无权代理

狭义的无权代理是指单纯欠缺代理权的无权代理。而欠缺代理权的原因可能是自始即未获得授权，或是代理权授与行为无效，在此二种情况下，都可能会导致代理人所做出的代理行为成为无权代理。
[编辑] 成立要件

   1. 代理人无代理权
   2. 以本人名义
   3. 须为法律行为

[编辑] 法律效果

关于无权代理所会产生的法律效果，主要有被本人的“承认权”、相对人的“催告权”以及相对人的“撤回权”，中华民国民法分别于于170条及171条做出规定。
[编辑] 本人的承认权

无权代理人所做出的代理行为，原则上处于一种效力未定的情形，亦即，非经本人同意，对本人不生效力。(中华民国民法170条第一项)这意味着本人对于该无权代理行为具有“承认权”，也就是本人可以决定是否使该无权代理行为对其发生效力。而这种承认属于一种“形成权”，就其性质而言，为一种“单独行为”。承认所会发生的效果，将使该无权代理行为溯及于代理人行为时即对本人发生效力。
[编辑] 相对人的催告权

由于无权代理行为再经本人决定是否承认以前，处于一种效力未定的状态，而这将使法律关系处于一种不确定的状态，对于相对人而言实属不利，为了使法律关系能尽早明确，故法律在此赋予相对人有“催告”的权利，使其得向本人为催告，而若本人于其所定的时间内未对之确答承认与否，则视为本人拒绝承认(中华民国民法170条)，此时将使该无权代理行为自始对本人不发生效力。
[编辑] 相对人的撤回权

对于无权代理行为，相对人除了可以行使“催告权”外，在本人未承认以前，尚可行使“撤回权”，撤回该无权代理行为，使其不会因为本人的承认而发生效力。而此种撤回权只要于本人未承认以前皆可行使，纵使其已向本人为“催告”，于本人未确答以前，仍得行使。但若是相对人于做出法律行为时，即明知代理人无代理权时，则此时相对人不能行使撤回权，而仅能向本人行使催告权而已，此乃是因为撤回权是在保护善意的相对人，故相对人为恶意时，不得行使此种权利。
[编辑] 表见代理

所谓的表见代理，是指无代理权人虽然做出无权代理行为，但是却因为本人的行为而在表面上产生代理权存在的外观，造成相对人信赖无权代理人有代理权，此时为了保护交易安全，应使本人对于相对人负责，而让该无权代理行为对本人发生效力。而要注意的是，表见代理只有在“意定代理”的情况下才能成立，于法定代理时无适用的可能。[1]就表见代理的种类，主要可以分为两种：“代理权继续存在的表见代理”和“代理权授与的表见代理”。
[编辑] 代理权继续存在的表见代理

这通常是发生在本人就代理权进行“限制”或“撤回”的情况，但是相对人对于该情形就却无法从外观得知，而误以为无权代理人仍具有完整的代理权。中华民国民法于107条规定：“代理权之限制及撤回，不得以之对抗善意第三人。但第三人因过失而不知其事实者，不在此限。”所指的即为此种情形。
[编辑] 构成要件

    * 代理权的限制与撤回
          o 代理权的限制：此乃本人对于代理权进行一部的限制，而若是代理人仍就该限制之部分行使代理权，将造成无权代理的情形。
          o 代理权的撤回：亦即本人就该代理权之全部予以撤回，此时代理权归于消灭。若代理人仍然行使该等代理权，将导致无权代理的结果。
    * 相对人系属善意

[编辑] 法律效果

依中华民国民法第107条，本人不得以代理权之欠缺对抗善意的相对人。然而因为其仍为无权代理之一种，故在本人为承认该无权代理行为以前，相对人仍然可以行使其“催告权”及“撤回权”。
[编辑] 代理权授与的表见代理

中华民国民法169条规定：“由自己之行为表示以代理权授与他人，或知他人表示为其代理人而不为反对之表示者，对于第三人应负授权人之责任。但第三人明知其无代理权或可得而知者，不在此限。”此即属于代理权授与的表见代理。意思就是说，第三人将因为本人的行为所产生的代理权授与之外观，而相信无权代理人具有代理权，进而与其从事法律行为。此时，为了保护第三人的信赖，并维护交易安全，故应使本人对于相对人负起授权人的责任。
[编辑] 构成要件

    * 代里权存在的外观

   1. 以自己之行为表示以代理权授与他人：这种情况又称为“表示授权”或“表见授权”，意即本人根本从未授与代理渠给无权代理人，但却对外表示其有授权与他人，此时该他人若行使该代理权，则会造成无权代理的情形。
   2. 明知他人表示为其代理人而不为反对之表示：此种情况又称为“容忍授权”。也就是本人容任无权代理人行使其从为授与的代理权之情形。

    * 相对人非明知或可得而知无代理权

[编辑] 法律效果

于此种情况下，依民法169条之规定，本人亦应负起授权人的责任，而此种责任应为履行责任，而非损害赔偿责任。又此属于一种“无过失责任”，纵使本人无故意或过失，亦要负责。[2]另外，要本人负此责任，必须要第三人(相对人)对此有所主张才行，法院不得迳将法律上的效果，归属于第三人。[3]又此亦为无权代理的态样之一，故在本人未承认以前，相对人仍得行使其“催告权”及“撤回权”。
[编辑] 无权代理人的赔偿责任

对于无权代理行为的善意相对人而言，有时可能会因为信赖该无权代理行为为有权代理，因此而遭受到损害，此时应该使其得向无权代理人请求损害赔偿。因此中华民国民法于110条便规定：“无代理权人，以他人之代理人名义所为之法律行为，对于善意之相对人，负损害赔偿之责。”此即无权代理人的赔偿责任的依据。而这种赔偿责任属于一种“无过失责任”，意味着，无论无权代理人纵使无故意或过失，对于善意的相对人仍须负起赔偿责任。
[编辑] 构成要件

   1. 无代理权人为代理行为
   2. 相对人系属善意
   3. 本人拒绝承认该代理行为
   4. 相对人因该无权代理行为而受到损害

[编辑] 法律效果

无权代理人须对受损害的善意相对人负损害赔偿责任，而就该损害赔偿请求权的消灭时效而言，目前台湾实务见解[4]认为，应该适用民法125条而为15年
[编辑] 例外

当无权代理人为无行为能力人或限制行为能力人时，目前台湾通说见解认为应该不使其负无权代理人的责任。因为就无行为能力人而言，其根本不具备为有效的意思表示之能力，故其所做出的法律行为应属无效，本来即无成立无权代理的可能。而对于限制行为能力人来说，使其负此种无过失责任亦太过沉重，基于民法保护未成年人的立场，应使其无庸负此种责任才是。
[编辑] 参考

   1. ^ 最高法院79年台上字2012号判例
   2. ^ 最高法院44年台上字1424号判例
   3. ^ 最高法院60年台上字2130号判例
   4. ^ 最高法院56年台上字305号判例

[编辑] 相关条目

    * 代理
    * 无过失责任
    * 请求权
    * 损害赔偿

来自“http://zh.wikipedia.org/wiki/%E7%84%A1%E6%AC%8A%E4%BB%A3%E7%90%86”
分类: 民法学</pre>
</div>
<div title="格式" modifier="Steve" created="200911071653" modified="200911100225" tags="测试" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100225">
<pre>至于怎么编写Tiddler，你觉得我会讲解这么没技术含量，而且在我上面介绍的TiddlyWiki教学/简介页面都可以看到的内容吗？好吧好吧，我就说这么几句。把下面这个复制进一个Tiddler，你会看到效果，立马明白。

    ''粗体字''  --删除线--  __下划线__  //斜体字//  ^^上标^^  ~~下标~~ @@color(red):文字颜色@@  @@bgcolor(yellow):文字底色@@
    [[NewTiddler]]  [[显示文字|实际Tiddler]]  ~ThisIsNotATiddler
    [[超链接]]  [[显示文字|实际链接]]  [img[显示文字|图像路径]] [img[图像路径][超链接]]
    /% 注释 %/ 

为什么需要 ~ ？因为TiddlyWiki会自动把一个没有空格并且有两个大写字母的英文字串当成是一个Tiddler的名字，如果此Tiddler还不存在，会以斜体的形式显示。加上~，TW就不这么做了。

结构化显示一般需要用到!、*、#、&gt;、{{{}}}和|
!这是第一级
!!这是第二级
!!!这是第三级
*这是第一个圆点
**这是第二个圆点
***这是第三个圆点
#这是第一节
##这是第一小节
###这是第一小小节
&gt;这是引文
&gt;&gt;这是引文里的引文
&gt;&gt;&gt;这是引文里的引文里的引文
{{{这里的 [[Tiddler]] 不会变成链接}}}
| A1 | A2 | A3 |
| B1 | B2 | B3 |
| C1 | C2 | C3 |
表格
|&gt;|产品价格表|
|!产品|!价格|
|手机|硬解900|
|~|软解1000|</pre>
</div>
<div title="民事法律关系" modifier="Steve" created="200911200732" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911200732">
<pre>民事法律关系是由民事法律规范所调整的社会关系，也是由民事法律规范所确认和保护的社会关系。为了使社会关系的确立和发展符合统治阶级的意志，统治阶级通过运用各种法律为人们的活动确立一定的标准，人们按照这样的标准而形成的社会关系就是法律关系。由民法所调整的社会关系就是民事法律关系。

　　民事法律关系的特征

　　1、民事法律关系是主体之间的民事权利和民事义务关系

　　2、民事法律关系是平等主体之间的关系

　　3、民事法律关系主要是财产关系。

　　4、民事法律关系的保障措施具有补偿性和财产性。民事责任以财产补偿为主要内容，惩罚性和非财产性责任不是主要的民事责任形式。

　　民事法律关系的分类

　　财产法律关系和人身法律关系

　　财产法律关系和人身法律关系还有以下几点区别

　　1、两类关系的权利性质不同。财产法律关系权利人可以依其意志转让。人格权和身份权一般不能转让给其他人。

　　2、对这两类关系的保护方法不同。在财产关系受到破坏时对加害人主要适用财产性质的责任。在人身法律关系受到破坏时对加害人主要适用非财产关系性质的责任。在人身法律关系受到破坏时，如果给权利人造成了物质利益损害，也可对加害人适用财产性质的责任。这主要是损害赔偿。但这种责任性质并不是保护人身法律关系的主要方法。

　　绝对法律关系和相对法律关系

　　绝对法律关系是指在权利人之外，一切不特定人均为义务人的民事法律关系。相对法律关系是指与权利人相对应的义务人具体、特定的民事法律关系。在这类法律关系中，权利人实现其权利必须有具体的义务人协助，并且义务人只是特定的一人或数人，其所承担的义务，一般是实施某种积极的行为。

　　物权关系和债权关系

　　根据权利人权利的实现方式，财产法律关系可以分为物权关系和债权关系，这也是上述绝对法律关系和相对法律关系在财产法律关系中的具体体现。

　　物权是一种绝对法律关系，所有权关系以及其他物权的关系都是物权关系。债权关系属于相对法律关系。

　　民法中建立了物权法和债权法这两大财产法律制度。

　　民事法律关系又可分为单一民事法律关系和复合民事法律关系；根据法律关系形成和实现的不同点又可分为正常实现的民事法律关系和民事责任关系。</pre>
</div>
<div title="民法" modifier="Steve" created="200911072052" modified="200911100635" tags="法学 民法 首页" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100635">
<pre>&lt;html&gt;
&lt;br&gt;
&lt;DIV&gt;&lt;FONT face=微软雅黑&gt;&lt;FONT size=6&gt;&lt;STRONG&gt;民法学习的总结归纳和整理。&lt;FONT face=微软雅黑&gt;
&lt;/html&gt;
</pre>
</div>
<div title="民法通则" modifier="Steve" created="200911080721" tags="法学 民法 法条" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911080721">
<pre>中华人民共和国民法通则

　　（一九八六年四月十二日第六届全国人民代表大会第四次会议通过）中华人民共和国主席令第三十七号

　　《中华人民共和国民法通则》已由中华人民共和国第六届全国人民代表大会第四次会议于一九八六年四月十二日通过，现予公布，自一九八七年一月一日起施行。

　　中华人民共和国主席  李先念

　　一九八六年四月十二日

　　目  录

　　第一章  基本原则

　　第二章  公民（自然人）

　　第一节  民事权利能力和民事行为能力

　　第二节  监护

　　第三节  宣告失踪和宣告死亡

　　第四节  个体工商户、农村承包经营户

　　第五节  个人合伙

　　第三章  法人

　　第一节  一般规定

　　第二节  企业法人

　　第三节  机关、事业单位和社会团体法人

　　第四节  联营

　　第四章  民事法律行为和代理

　　第一节  民事法律行为

　　第二节  代理

　　第五章  民事权利

　　第一节  财产所有权和与财产所有权有关的

　　财产权

　　第二节  债权

　　第三节  知识产权

　　第四节  人身权

　　第六章  民事责任

　　第一节  一般规定

　　第二节  违反合同的民事责任

　　第三节  侵权的民事责任

　　第四节  承担民事责任的方式

　　第七章  诉讼时效

　　第八章  涉外民事关系的法律适用

　　第九章  附则第一章  基本原则

　　第一条  为了保障公民、法人的合法的民事权益，正确调整民事关系，适应社会主义现代化建设事业发展的需要，根据宪法和我国实际情况，总结民事活动的实践经验，制定本法。

　　第二条  中华人民共和国民法调整平等主体的公民之间、法人之间、公民和法人之间的财产关系和人身关系。

　　第三条  当事人在民事活动中的地位平等。

　　第四条  民事活动应当遵循自愿、公平、等价有偿、诚实信用的原则。

　　第五条  公民、法人的合法的民事权益受法律保护，任何组织和个人不得侵犯。

　　第六条  民事活动必须遵守法律，法律没有规定的，应当遵守国家政策。

　　第七条  民事活动应当尊重社会公德，不得损害社会公共利益，破坏国家经济计划，扰乱社会经济秩序。

　　第八条  在中华人民共和国领域内的民事活动，适用中华人民共和国法律，法律另有规定的除外。

　　本法关于公民的规定，适用于在中华人民共和国领域内的外国人、无国籍人，法律另有规定的除外。第二章  公民（自然人）

　　第一节  民事权利能力和民事行为能力

　　第九条  公民从出生时起到死亡时止，具有民事权利能力，依法享有民事权利，承担民事义务。

　　第十条  公民的民事权利能力一律平等。

　　第十一条  十八周岁以上的公民是成年人，具有完全民事行为能力，可以独立进行民事活动，是完全民事行为能力人。

　　十六周岁以上不满十八周岁的公民，以自己的劳动收入为主要生活来源的，视为完全民事行为能力人。

　　第十二条  十周岁以上的未成年人是限制民事行为能力人，可以进行与他的年龄、智力相适应的民事活动；其他民事活动由他的法定代理人代理，或者征得他的法定代理人的同意。

　　不满十周岁的未成年人是无民事行为能力人，由他的法定代理人代理民事活动。

　　第十三条  不能辨认自己行为的精神病人是无民事行为能力人，由他的法定代理人代理民事活动。

　　不能完全辨认自己行为的精神病人是限制民事行为能力人，可以进行与他的精神健康状况相适应的民事活动；其他民事活动由他的法定代理人代理，或者征得他的法定代理人的同意。

　　第十四条  无民事行为能力人、限制民事行为能力人的监护人是他的法定代理人。

　　第十五条  公民以他的户籍所在地的居住地为住所，经常居住地与住所不一致的，经常居住地视为住所。第二节  监  护

　　第十六条  未成年人的父母是未成年人的监护人。

　　未成年人的父母已经死亡或者没有监护能力的，由下列人员中有监护能力的人担任监护人：

　　（一）祖父母、外祖父母；

　　（二）兄、姐；

　　（三）关系密切的其他亲属、朋友愿意承担监护责任，经未成年人的父、母的所在单位或者未成年人住所地的居民委员会、村民委员会同意的。

　　对担任监护人有争议的，由未成年人的父、母的所在单位或者未成年人住所地的居民委员会、村民委员会在近亲属中指定。对指定不服提起诉讼的，由人民法院裁决。

　　没有第一款、第二款规定的监护人的，由未成年人的父、母的所在单位或者未成年人住所地的居民委员会、村民委员会或者民政部门担任监护人。

　　第十七条  无民事行为能力或者限制民事行为能力的精神病人，由下列人员担任监护人：

　　（一）配偶；

　　（二）父母；

　　（三）成年子女；

　　（四）其他近亲属；

　　（五）关系密切的其他亲属、朋友愿意承担监护责任，经精神病人的所在单位或者住所地的居民委员会、村民委员会同意的。

　　对担任监护人有争议的，由精神病人的所在单位或者住所地的居民委员会、村民委员会在近亲属中指定。对指定不服提起诉讼的，由人民法院裁决。

　　没有第一款规定的监护人的，由精神病人的所在单位或者住所地的居民委员会、村民委员会或者民政部门担任监护人。

　　第十八条  监护人应当履行监护职责，保护被监护人的人身、财产及其他合法权益，除为被监护人的利益外，不得处理被监护人的财产。

　　监护人依法履行监护的权利，受法律保护。

　　监护人不履行监护职责或者侵害被监护人的合法权益的，应当承担责任；给被监护人造成财产损失的，应当赔偿损失。人民法院可以根据有关人员或者有关单位的申请，撤销监护人的资格。

　　第十九条  精神病人的利害关系人，可以向人民法院申请宣告精神病人为无民事行为能力人或者限制民事行为能力人。

　　被人民法院宣告为无民事行为能力人或者限制民事行为能力人的，根据他健康恢复的状况，经本人或者利害关系人申请，人民法院可以宣告他为限制民事行为能力人或者完全民事行为能力人。第三节  宣告失踪和宣告死亡

　　第二十条  公民下落不明满二年的，利害关系人可以向人民法院申请宣告他为失踪人。

　　战争期间下落不明的，下落不明的时间从战争结束之日起计算。

　　第二十一条  失踪人的财产由他的配偶、父母、成年子女或者关系密切的其他亲属、朋友代管。代管有争议的，没有以上规定的人或者以上规定的人无能力代管的，由人民法院指定的人代管。

　　失踪人所欠税款、债务和应付的其他费用，由代管人从失踪人的财产中支付。

　　第二十二条  被宣告失踪的人重新出现或者确知他的下落，经本人或者利害关系人申请，人民法院应当撤销对他的失踪宣告。

　　第二十三条  公民有下列情形之一的，利害关系人可以向人民法院申请宣告他死亡：

　　（一）下落不明满四年的；

　　（二）因意外事故下落不明，从事故发生之日起满二年的。

　　战争期间下落不明的，下落不明的时间从战争结束之日起计算。

　　第二十四条  被宣告死亡的人重新出现或者确知他没有死亡，经本人或者利害关系人申请，人民法院应当撤销对他的死亡宣告。

　　有民事行为能力人在被宣告死亡期间实施的民事法律行为有效。

　　第二十五条  被撤销死亡宣告的人有权请求返还财产。依照继承法取得他的财产的公民或者组织，应当返还原物；原物不存在的，给予适当补偿。第四节  个体工商户、农村承包经营户

　　第二十六条  公民在法律允许的范围内，依法经核准登记，从事工商业经营的，为个体工商户。个体工商户可以起字号。

　　第二十七条  农村集体经济组织的成员，在法律允许的范围内，按照承包合同规定从事商品经营的，为农村承包经营户。

　　第二十八条  个体工商户、农村承包经营户的合法权益，受法律保护。

　　第二十九条  个体工商户、农村承包经营户的债务，个人经营的，以个人财产承担；家庭经营的，以家庭财产承担。第五节  个人合伙

　　第三十条  个人合伙是指两个以上公民按照协议，各自提供资金、实物、技术等，合伙经营、共同劳动。

　　第三十一条  合伙人应当对出资数额、盈余分配、债务承担、入伙、退伙、合伙终止等事项，订立书面协议。

　　第三十二条  合伙人投入的财产，由合伙人统一管理和使用。

　　合伙经营积累的财产，归合伙人共有。

　　第三十三条  个人合伙可以起字号，依法经核准登记，在核准登记的经营范围内从事经营。

　　第三十四条  个人合伙的经营活动，由合伙人共同决定，合伙人有执行和监督的权利。

　　合伙人可以推举负责人。合伙负责人和其他人员的经营活动，由全体合伙人承担民事责任。

　　第三十五条  合伙的债务，由合伙人按照出资比例或者协议的约定，以各自的财产承担清偿责任。

　　合伙人对合伙的债务承担连带责任，法律另有规定的除外。偿还合伙债务超过自己应当承担数额的合伙人，有权向其他合伙人追偿。第三章  法  人

　　第一节  一般规定

　　第三十六条  法人是具有民事权利能力和民事行为能力，依法独立享有民事权利和承担民事义务的组织。

　　法人的民事权利能力和民事行为能力，从法人成立时产生，到法人终止时消灭。

　　第三十七条  法人应当具备下列条件：

　　（一）依法成立；

　　（二）有必要的财产或者经费；

　　（三）有自己的名称、组织机构和场所；

　　（四）能够独立承担民事责任。

　　第三十八条  依照法律或者法人组织章程规定，代表法人行使职权的负责人，是法人的法定代表人。

　　第三十九条  法人以它的主要办事机构所在地为住所。

　　第四十条  法人终止，应当依法进行清算，停止清算范围外的活动。第二节  企业法人

　　第四十一条  全民所有制企业、集体所有制企业有符合国家规定的资金数额，有组织章程、组织机构和场所，能够独立承担民事责任，经主管机关核准登记，取得法人资格。

　　在中华人民共和国领域内设立的中外合资经营企业、中外合作经营企业和外资企业，具备法人条件的，依法经工商行政管理机关核准登记，取得中国法人资格。

　　第四十二条  企业法人应当在核准登记的经营范围内从事经营。

　　第四十三条  企业法人对它的法定代表人和其他工作人员的经营活动，承担民事责任。

　　第四十四条  企业法人分立、合并或者有其他重要事项变更，应当向登记机关办理登记并公告。

　　企业法人分立、合并，它的权利和义务由变更后的法人享有和承担。

　　第四十五条  企业法人由于下列原因之一终止：

　　（一）依法被撤销；

　　（二）解散；

　　（三）依法宣告破产；

　　（四）其他原因。

　　第四十六条  企业法人终止，应当向登记机关办理注销登记并公告。

　　第四十七条  企业法人解散，应当成立清算组织，进行清算。企业法人被撤销、被宣告破产的，应当由主管机关或者人民法院组织有关机关和有关人员成立清算组织，进行清算。

　　第四十八条  全民所有制企业法人以国家授予它经营管理的财产承担民事责任。集体所有制企业法人以企业所有的财产承担民事责任。中外合资经营企业法人、中外合作经营企业法人和外资企业法人以企业所有的财产承担民事责任，法律另有规定的除外。

　　第四十九条  企业法人有下列情形之一的，除法人承担责任外，对法定代表人可以给予行政处分、罚款，构成犯罪的，依法追究刑事责任：

　　（一）超出登记机关核准登记的经营范围从事非法经营的；

　　（二）向登记机关、税务机关隐瞒真实情况、弄虚作假的；

　　（三）抽逃资金、隐匿财产逃避债务的；

　　（四）解散、被撤销、被宣告破产后，擅自处理财产的；

　　（五）变更、终止时不及时申请办理登记和公告，使利害关系人遭受重大损失的；

　　（六）从事法律禁止的其他活动，损害国家利益或者社会公共利益的。第三节  机关、事业单位和社会团体法人

　　第五十条  有独立经费的机关从成立之日起，具有法人资格。

　　具备法人条件的事业单位、社会团体，依法不需要办理法人登记的，从成立之日起，具有法人资格；依法需要办理法人登记的，经核准登记，取得法人资格。第四节  联  营

　　第五十一条  企业之间或者企业、事业单位之间联营，组成新的经济实体，独立承担民事责任、具备法人条件的，经主管机关核准登记，取得法人资格。

　　第五十二条  企业之间或者企业、事业单位之间联营，共同经营、不具备法人条件的，由联营各方按照出资比例或者协议的约定，以各自所有的或者经营管理的财产承担民事责任。依照法律的规定或者协议的约定负连带责任的，承担连带责任。

　　第五十三条  企业之间或者企业、事业单位之间联营，按照合同的约定各自独立经营的，它的权利和义务由合同约定，各自承担民事责任。第四章  民事法律行为和代理

　　第一节  民事法律行为

　　第五十四条  民事法律行为是公民或者法人设立、变更、终止民事权利和民事义务的合法行为。

　　第五十五条  民事法律行为应当具备下列条件：

　　（一）行为人具有相应的民事行为能力；

　　（二）意思表示真实；

　　（三）不违反法律或者社会公共利益。

　　第五十六条  民事法律行为可以采取书面形式、口头形式或者其他形式。法律规定是特定形式的，应当依照法律规定。

　　第五十七条  民事法律行为从成立时起具有法律约束力。行为人非依法律规定或者取得对方同意，不得擅自变更或者解除。

　　第五十八条  下列民事行为无效：

　　（一）无民事行为能力人实施的；

　　（二）限制民事行为能力人依法不能独立实施的；

　　（三）一方以欺诈、胁迫的手段或者乘人之危，使对方在违背真实意思的情况下所为的；

　　（四）恶意串通，损害国家、集体或者第三人利益的；

　　（五）违反法律或者社会公共利益的；

　　（六）经济合同违反国家指令性计划的；

　　（七）以合法形式掩盖非法目的的。

　　无效的民事行为，从行为开始起就没有法律约束力。

　　第五十九条  下列民事行为，一方有权请求人民法院或者仲裁机关予以变更或者撤销：

　　（一）行为人对行为内容有重大误解的；

　　（二）显失公平的。

　　被撤销的民事行为从行为开始起无效。

　　第六十条  民事行为部分无效，不影响其他部分的效力的，其他部分仍然有效。

　　第六十一条  民事行为被确认为无效或者被撤销后，当事人因该行为取得的财产，应当返还给受损失的一方。有过错的一方应当赔偿对方因此所受的损失，对方都有过错的，应当各自承担相应的责任。

　　双方恶意串通，实施民事行为损害国家的、集体的或者第三人的利益的，应当追缴双方取得的财产，收归国家、集体所有或者返还第三人。

　　第六十二条  民事法律行为可以附条件，附条件的民事法律行为在符合所附条件时生效。第二节  代理

　　第六十三条  公民、法人可以通过代理人实施民事法律行为。

　　代理人在代理权限内，以被代理人的名义实施民事法律行为。被代理人对代理人的代理行为，承担民事责任。

　　依照法律规定或者按照双方当事人约定，应当由本人实施的民事法律行为，不得代理。

　　第六十四条  代理包括委托代理、法定代理和指定代理。

　　委托代理人按照被代理人的委托行使代理权，法定代理人依照法律的规定行使代理权，指定代理人按照人民法院或者指定单位的指定行使代理权。

　　第六十五条  民事法律行为的委托代理，可以用书面形式，也可以用口头形式。法律规定用书面形式的，应当用书面形式。

　　书面委托代理的授权委托书应当载明代理人的姓名或者名称、代理事项、权限和期间，并由委托人签名或者盖章。

　　委托书授权不明的，被代理人应当向第三人承担民事责任，代理人负连带责任。

　　第六十六条  没有代理权、超越代理权或者代理权终止后的行为，只有经过被代理人的追认，被代理人才承担民事责任。未经追认的行为，由行为人承担民事责任。本人知道他人以本人名义实施民事行为而不作否认表示的，视为同意。

　　代理人不履行职责而给被代理人造成损害的，应当承担民事责任。

　　代理人和第三人串通，损害被代理人的利益的，由代理人和第三人负连带责任。

　　第三人知道行为人没有代理权、超越代理权或者代理权已终止还与行为人实施民事行为给他人造成损害的，由第三人和行为人负连带责任。

　　第六十七条  代理人知道被委托代理的事项违法仍然进行代理活动的，或者被代理人知道代理人的代理行为违法不表示反对的，由被代理人和代理人负连带责任。

　　第六十八条  委托代理人为被代理人的利益需要转托他人代理的，应当事先取得被代理人的同意。事先没有取得被代理人同意的，应当在事后及时告诉被代理人，如果被代理人不同意，由代理人对自己所转托的人的行为负民事责任，但在紧急情况下，为了保护被代理人的利益而转托他人代理的除外。

　　第六十九条  有下列情形之一的，委托代理终止：

　　（一）代理期间届满或者代理事务完成；

　　（二）被代理人取消委托或者代理人辞去委托；

　　（三）代理人死亡；

　　（四）代理人丧失民事行为能力；

　　（五）作为被代理人或者代理人的法人终止。

　　第七十条  有下列情形之一的，法定代理或者指定代理终止：

　　（一）被代理人取得或者恢复民事行为能力；

　　（二）被代理人或者代理人死亡；

　　（三）代理人丧失民事行为能力；

　　（四）指定代理的人民法院或者指定单位取消指定；

　　（五）由其他原因引起的被代理人和代理人之间的监护关系消灭。第五章  民事权利

　　第一节  财产所有权和与财产所有权有关的财产权

　　第七十一条  财产所有权是指所有人依法对自己的财产享有占有、使用、收益和处分的权利。

　　第七十二条  财产所有权的取得，不得违反法律规定。

　　按照合同或者其他合法方式取得财产的，财产所有权从财产交付时起转移，法律另有规定或者当事人另有约定的除外。

　　第七十三条  国家财产属于全民所有。

　　国家财产神圣不可侵犯，禁止任何组织或者个人侵占、哄抢、私分、截留、破坏。

　　第七十四条  劳动群众集体组织的财产属于劳动群众集体所有，包括：

　　（一）法律规定为集体所有的土地和森林、山岭、草原、荒地、滩涂等；

　　（二）集体经济组织的财产；

　　（三）集体所有的建筑物、水库、农田水利设施和教育、科学、文化、卫生、体育等设施；

　　（四）集体所有的其他财产。

　　集体所有的土地依照法律属于村农民集体所有，由村农业生产合作社等农业集体经济组织或者村民委员会经营、管理。已经属于乡（镇）农民集体经济组织所有的，可以属于乡（镇）农民集体所有。

　　集体所有的财产受法律保护，禁止任何组织或者个人侵占、哄抢、私分、破坏或者非法查封、扣押、冻结、没收。

　　第七十五条  公民的个人财产，包括公民的合法收入、房屋、储蓄、生活用品、文物、图书资料、林木、牲畜和法律允许公民所有的生产资料以及其他合法财产。

　　公民的合法财产受法律保护，禁止任何组织或者个人侵占、哄抢、破坏或者非法查封、扣押、冻结、没收。

　　第七十六条  公民依法享有财产继承权。

　　第七十七条  社会团体包括宗教团体的合法财产受法律保护。

　　第七十八条  财产可以由两个以上的公民、法人共有。

　　共有分为按份共有和共同共有。按份共有人按照各自的份额，对共有财产分享权利，分担义务。共同共有人对共有财产享有权利，承担义务。

　　按份共有财产的每个共有人有权要求将自己的份额分出或者转让。但在出售时，其他共有人在同等条件下，有优先购买的权利。

　　第七十九条  所有人不明的埋藏物、隐藏物，归国家所有。接收单位应当对上缴的单位或者个人，给予表扬或者物质奖励。

　　拾得遗失物、漂流物或者失散的饲养动物，应当归还失主，因此而支出的费用由失主偿还。

　　第八十条  国家所有的土地，可以依法由全民所有制单位使用，也可以依法确定由集体所有制单位使用，国家保护它的使用、收益的权利；使用单位有管理、保护、合理利用的义务。

　　公民、集体依法对集体所有的或者国家所有由集体使用的土地的承包经营权，受法律保护。承包双方的权利和义务，依照法律由承包合同规定。

　　土地不得买卖、出租、抵押或者以其他形式非法转让。

　　第八十一条  国家所有的森林、山岭、草原、荒地、滩涂、水面等自然资源，可以依法由全民所有制单位使用，也可以依法确定由集体所有制单位使用，国家保护它的使用、收益的权利；使用单位有管理、保护、合理利用的义务。

　　国家所有的矿藏，可以依法由全民所有制单位和集体所有制单位开采，也可以依法由公民采挖。国家保护合法的采矿权。

　　公民、集体依法对集体所有的或者国家所有由集体使用的森林、山岭、草原、荒地、滩涂、水面的承包经营权，受法律保护。承包双方的权利和义务，依照法律由承包合同规定。

　　国家所有的矿藏、水流，国家所有的和法律规定属于集体所有的林地、山岭、草原、荒地、滩涂不得买卖、出租、抵押或者以其他形式非法转让。

　　第八十二条  全民所有制企业对国家授予它经营管理的财产依法享有经营权，受法律保护。

　　第八十三条  不动产的相邻各方，应当按照有利生产、方便生活、团结互助、公平合理的精神，正确处理截水、排水、通行、通风、采光等方面的相邻关系。给相邻方造成妨碍或者损失的，应当停止侵害，排除妨碍，赔偿损失。第二节  债  权

　　第八十四条  债是按照合同的约定或者依照法律的规定，在当事人之间产生的特定的权利和义务关系，享有权利的人是债权人，负有义务的人是债务人。

　　债权人有权要求债务人按照合同的约定或者依照法律的规定履行义务。

　　第八十五条  合同是当事人之间设立、变更、终止民事关系的协议。依法成立的合同，受法律保护。

　　第八十六条  债权人为二人以上的，按照确定的份额分享权利。债务人为二人以上的，按照确定的份额分担义务。

　　第八十七条  债权人或者债务人一方人数为二人以上的，依照法律的规定或者当事人的约定，享有连带权利的每个债权人，都有权要求债务人履行义务；负有连带义务的每个债务人，都负有清偿全部债务的义务，履行了义务的人，有权要求其他负有连带义务的人偿付他应当承担的份额。

　　第八十八条  合同的当事人应当按照合同的约定，全部履行自己的义务。

　　合同中有关质量、期限、地点或者价款约定不明确，按照合同有关条款内容不能确定，当事人又不能通过协商达成协议的，适用下列规定：

　　（一）质量要求不明确的，按照国家质量标准履行，没有国家质量标准的，按照通常标准履行。

　　（二）履行期限不明确的，债务人可以随时向债权人履行义务，债权人也可以随时要求债务人履行义务，但应当给对方必要的准备时间。

　　（三）履行地点不明确，给付货币的，在接受给付一方的所在地履行，其他标的在履行义务一方的所在地履行。

　　（四）价款约定不明确的，按照国家规定的价格履行；没有国家规定价格的，参照市场价格或者同类物品的价格或者同类劳务的报酬标准履行。

　　合同对专利申请权没有约定的，完成发明创造的当事人享有申请权。

　　合同对科技成果的使用权没有约定的，当事人都有使用的权利。

　　第八十九条  依照法律的规定或者按照当事人的约定，可以采用下列方式担保债务的履行：

　　（一）保证人向债权人保证债务人履行债务，债务人不履行债务的，按照约定由保证人履行或者承担连带责任；保证人履行债务后，有权向债务人追偿。

　　（二）债务人或者第三人可以提供一定的财产作为抵押物。债务人不履行债务的，债权人有权依照法律的规定以抵押物折价或者以变卖抵押物的价款优先得到偿还。

　　（三）当事人一方在法律规定的范围内可以向对方给付定金。债务人履行债务后，定金应当抵作价款或者收回。给付定金的一方不履行债务的，无权要求返还定金；接受定金的一方不履行债务的，应当双倍返还定金。

　　（四）按照合同约定一方占有对方的财产，对方不按照合同给付应付款项超过约定期限的，占有人有权留置该财产，依照法律的规定以留置财产折价或者以变卖该财产的价款优先得到偿还。

　　第九十条  合法的借贷关系受法律保护。

　　第九十一条  合同一方将合同的权利、义务全部或者部分转让给第三人的，应当取得合同另一方的同意，并不得牟利。依照法律规定应当由国家批准的合同，需经原批准机关批准。但是，法律另有规定或者原合同另有约定的除外。

　　第九十二条  没有合法根据，取得不当利益，造成他人损失的，应当将取得的不当利益返还受损失的人。

　　第九十三条  没有法定的或者约定的义务，为避免他人利益受损失进行管理或者服务的，有权要求受益人偿付由此而支付的必要费用。第三节  知识产权

　　第九十四条  公民、法人享有著作权（版权），依法有署名、发表、出版、获得报酬等权利。

　　第九十五条  公民、法人依法取得的专利权受法律保护。

　　第九十六条  法人、个体工商户、个人合伙依法取得的商标专用权受法律保护。

　　第九十七条  公民对自己的发现享有发现权。发现人有权申请领取发现证书、奖金或者其他奖励。

　　公民对自己的发明或者其他科技成果，有权申请领取荣誉证书、奖金或者其他奖励。第四节  人  身  权

　　第九十八条  公民享有生命健康权。

　　第九十九条  公民享有姓名权，有权决定、使用和依照规定改变自己的姓名，禁止他人干涉、盗用、假冒。

　　法人、个体工商户、个人合伙享有名称权。企业法人、个体工商户、个人合伙有权使用、依法转让自己的名称。

　　第一百条  公民享有肖像权，未经本人同意，不得以营利为目的使用公民的肖像。

　　第一百零一条  公民、法人享有名誉权，公民的人格尊严受法律保护，禁止用侮辱、诽谤等方式损害公民、法人的名誉。

　　第一百零二条  公民、法人享有荣誉权，禁止非法剥夺公民、法人的荣誉称号。

　　第一百零三条  公民享有婚姻自主权，禁止买卖、包办婚姻和其他干涉婚姻自由的行为。

　　第一百零四条  婚姻、家庭、老人、母亲和儿童受法律保护。

　　残疾人的合法权益受法律保护。

　　第一百零五条  妇女享有同男子平等的民事权利。第六章  民事责任

　　第一节  一般规定

　　第一百零六条  公民、法人违反合同或者不履行其他义务的，应当承担民事责任。

　　公民、法人由于过错侵害国家的、集体的财产，侵害他人财产、人身的，应当承担民事责任。

　　没有过错，但法律规定应当承担民事责任的，应当承担民事责任。

　　第一百零七条  因不可抗力不能履行合同或者造成他人损害的，不承担民事责任，法律另有规定的除外。

　　第一百零八条  债务应当清偿。暂时无力偿还的，经债权人同意或者人民法院裁决，可以由债务人分期偿还。有能力偿还拒不偿还的，由人民法院判决强制偿还。

　　第一百零九条  因防止、制止国家的、集体的财产或者他人的财产、人身遭受侵害而使自己受到损害的，由侵害人承担赔偿责任，受益人也可以给予适当的补偿。

　　第一百一十条  对承担民事责任的公民、法人需要追究行政责任的，应当追究行政责任；构成犯罪的，对公民、法人的法定代表人应当依法追究刑事责任。第二节  违反合同的民事责任

　　第一百一十一条  当事人一方不履行合同义务或者履行合同义务不符合约定条件的，另一方有权要求履行或者采取补救措施，并有权要求赔偿损失。

　　第一百一十二条  当事人一方违反合同的赔偿责任，应当相当于另一方因此所受到的损失。

　　当事人可以在合同中约定，一方违反合同时，向另一方支付一定数额的违约金；也可以在合同中约定对于违反合同而产生的损失赔偿额的计算方法。

　　第一百一十三条  当事人双方都违反合同的，应当分别承担各自应负的民事责任。

　　第一百一十四条  当事人一方因另一方违反合同受到损失的，应当及时采取措施防止损失的扩大；没有及时采取措施致使损失扩大的，无权就扩大的损失要求赔偿。

　　第一百一十五条  合同的变更或者解除，不影响当事人要求赔偿损失的权利。

　　第一百一十六条  当事人一方由于上级机关的原因，不能履行合同义务的，应当按照合同约定向另一方赔偿损失或者采取其他补救措施，再由上级机关对它因此受到的损失负责处理。第三节  侵权的民事责任

　　第一百一十七条  侵占国家的、集体的财产或者他人财产的，应当返还财产，不能返还财产的，应当折价赔偿。

　　损坏国家的、集体的财产或者他人财产的，应当恢复原状或者折价赔偿。

　　受害人因此遭受其他重大损失的，侵害人并应当赔偿损失。

　　第一百一十八条  公民、法人的著作权（版权）、专利权、商标专用权、发现权、发明权和其他科技成果权受到剽窃、篡改、假冒等侵害的，有权要求停止侵害，消除影响，赔偿损失。

　　第一百一十九条  侵害公民身体造成伤害的，应当赔偿医疗费、因误工减少的收入、残废者生活补助费等费用；造成死亡的，并应当支付丧葬费、死者生前扶养的人必要的生活费等费用。

　　第一百二十条  公民的姓名权、肖像权、名誉权、荣誉权受到侵害的，有权要求停止侵害，恢复名誉，消除影响，赔礼道歉，并可以要求赔偿损失。

　　法人的名称权、名誉权、荣誉权受到侵害的，适用前款规定。

　　第一百二十一条  国家机关或者国家机关工作人员在执行职务中，侵犯公民、法人的合法权益造成损害的，应当承担民事责任。

　　第一百二十二条  因产品质量不合格造成他人财产、人身损害的，产品制造者、销售者应当依法承担民事责任。运输者、仓储者对此负有责任的，产品制造者、销售者有权要求赔偿损失。

　　第一百二十三条  从事高空、高压、易燃、易爆、剧毒、放射性、高速运输工具等对周围环境有高度危险的作业造成他人损害的，应当承担民事责任；如果能够证明损害是由受害人故意造成的，不承担民事责任。

　　第一百二十四条  违反国家保护环境防止污染的规定，污染环境造成他人损害的，应当依法承担民事责任。

　　第一百二十五条  在公共场所、道旁或者通道上挖坑、修缮安装地下设施等，没有设置明显标志和采取安全措施造成他人损害的，施工人应当承担民事责任。

　　第一百二十六条  建筑物或者其他设施以及建筑物上的搁置物、悬挂物发生倒塌、脱落、坠落造成他人损害的，它的所有人或者管理人应当承担民事责任，但能够证明自己没有过错的除外。

　　第一百二十七条  饲养的动物造成他人损害的，动物饲养人或者管理人应当承担民事责任；由于受害人的过错造成损害的，动物饲养人或者管理人不承担民事责任；由于第三人的过错造成损害的，第三人应当承担民事责任。

　　第一百二十八条  因正当防卫造成损害的，不承担民事责任。正当防卫超过必要的限度，造成不应有的损害的，应当承担适当的民事责任。

　　第一百二十九条  因紧急避险造成损害的，由引起险情发生的人承担民事责任。如果危险是由自然原因引起的，紧急避险人不承担民事责任或者承担适当的民事责任。因紧急避险采取措施不当或者超过必要的限度，造成不应有的损害的，紧急避险人应当承担适当的民事责任。

　　第一百三十条  二人以上共同侵权造成他人损害的，应当承担连带责任。

　　第一百三十一条  受害人对于损害的发生也有过错的，可以减轻侵害人的民事责任。

　　第一百三十二条  当事人对造成损害都没有过错的，可以根据实际情况，由当事人分担民事责任。

　　第一百三十三条  无民事行为能力人、限制民事行为能力人造成他人损害的，由监护人承担民事责任。监护人尽了监护责任的，可以适当减轻他的民事责任。

　　有财产的无民事行为能力人、限制民事行为能力人造成他人损害的，从本人财产中支付赔偿费用。不足部分，由监护人适当赔偿，但单位担任监护人的除外。

　　第六章  民事责任

　　第四节承担民事责任的方式

　　第一百三十四条  承担民事责任的方式主要有：

　　（一）停止侵害；

　　（二）排除妨碍；

　　（三）消除危险；

　　（四）返还财产；

　　（五）恢复原状；

　　（六）修理、重作、更换；

　　（七）赔偿损失；

　　（八）支付违约金；

　　（九）消除影响、恢复名誉；

　　（十）赔礼道歉。

　　以上承担民事责任的方式，可以单独适用，也可以合并适用。

　　人民法院审理民事案件，除适用上述规定外，还可以予以训诫、责令具结悔过、收缴进行非法活动的财物和非法所得，并可以依照法律规定处以罚款、拘留。第七章  诉讼时效

　　第一百三十五条  向人民法院请求保护民事权利的诉讼时效期间为二年，法律另有规定的除外。

　　第一百三十六条  下列的诉讼时效期间为一年：

　　（一）身体受到伤害要求赔偿的；

　　（二）出售质量不合格的商品未声明的；

　　（三）延付或者拒付租金的；

　　（四）寄存财物被丢失或者损毁的。

　　第一百三十七条  诉讼时效期间从知道或者应当知道权利被侵害时起计算。但是，从权利被侵害之日起超过二十年的，人民法院不予保护。有特殊情况的，人民法院可以延长诉讼时效期间。

　　第一百三十八条  超过诉讼时效期间，当事人自愿履行的，不受诉讼时效限制。

　　第一百三十九条  在诉讼时效期间的最后六个月内，因不可抗力或者其他障碍不能行使请求权的，诉讼时效中止。从中止时效的原因消除之日起，诉讼时效期间继续计算。

　　第一百四十条  诉讼时效因提起诉讼、当事人一方提出要求或者同意履行义务而中断。从中断时起，诉讼时效期间重新计算。

　　第一百四十一条  法律对诉讼时效另有规定的，依照法律规定。第八章  涉外民事关系的法律适用

　　第一百四十二条  涉外民事关系的法律适用，依照本章的规定确定。

　　中华人民共和国缔结或者参加的国际条约同中华人民共和国的民事法律有不同规定的，适用国际条约的规定，但中华人民共和国声明保留的条款除外。

　　中华人民共和国法律和中华人民共和国缔结或者参加的国际条约没有规定的，可以适用国际惯例。

　　第一百四十三条  中华人民共和国公民定居国外的，他的民事行为能力可以适用定居国法律。

　　第一百四十四条  不动产的所有权，适用不动产所在地法律。

　　第一百四十五条  涉外合同的当事人可以选择处理合同争议所适用的法律，法律另有规定的除外。

　　涉外合同的当事人没有选择的，适用与合同有最密切联系的国家的法律。

　　第一百四十六条  侵权行为的损害赔偿，适用侵权行为地法律。当事人双方国籍相同或者在同一国家有住所的，也可以适用当事人本国法律或者住所地法律。

　　中华人民共和国法律不认为在中华人民共和国领域外发生的行为是侵权行为的，不作为侵权行为处理。

　　第一百四十七条  中华人民共和国公民和外国人结婚适用婚姻缔结地法律，离婚适用受理案件的法院所在地法律。

　　第一百四十八条  扶养适用与被扶养人有最密切联系的国家的法律。

　　第一百四十九条  遗产的法定继承，动产适用被继承人死亡时住所地法律，不动产适用不动产所在地法律。

　　第一百五十条  依照本章规定适用外国法律或者国际惯例的，不得违背中华人民共和国的社会公共利益。第九章  附  则

　　第一百五十一条  民族自治地方的人民代表大会可以根据本法规定的原则，结合当地民族的特点，制定变通的或者补充的单行条例或者规定。自治区人民代表大会制定的，依照法律规定报全国人民代表大会常务委员会批准或者备案；自治州、自治县人民代表大会制定的，报省、自治区人民代表大会常务委员会批准。

　　第一百五十二条  本法生效以前，经省、自治区、直辖市以上主管机关批准开办的全民所有制企业，已经向工商行政管理机关登记的，可以不再办理法人登记，即具有法人资格。

　　第一百五十三条  本法所称的“不可抗力”，是指不能预见、不能避免并不能克服的客观情况。

　　第一百五十四条  民法所称的期间按照公历年、月、日、小时计算。

　　规定按照小时计算期间的，从规定时开始计算。规定按照日、月、年计算期间的，开始的当天不算入，从下一天开始计算。

　　期间的最后一天是星期日或者其他法定休假日的，以休假日的次日为期间的最后一天。

　　期间的最后一天的截止时间为二十四点。有业务时间的，到停止业务活动的时间截止。

　　第一百五十五条  民法所称的“以上”、“以下”、“以内”、“届满”，包括本数；所称的“不满”、“以外”，不包括本数。

　　第一百五十六条  本法自一九八七年一月一日起施行。</pre>
</div>
<div title="法律关系" modifier="Steve" created="200911072137" modified="200911072139" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911072139">
<pre>法律关系是主体间具有法律强制性的关系。
所谓法律强制力，即法律规定，关系一方可为特定行为（含不作为），另一方必须为特定行为（含不作为）。
可以推论：
（1）法律关系是法律主体与法律主体之间的关系，非法律主体不可能成为法律关系的一方。这里，物不能成为法律主体，因为法律主体必有意志，才能享有法律所规定的各项利益和履行法律所规定的义务。因此，物权关系中人与物的关系并非法律关系，而是权利主体与权利客体的关系。物权关系是人与对物享有物权的权利人之间的关系。
（2）法律关系是具有强制力的关系。这是法律关系不同于道德上的亲朋好友关系和宗教上朝圣、接受洗礼等宗教关系的重要区别点。</pre>
</div>
<div title="法律行为" modifier="Steve" created="200911072134" modified="200911072139" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911072139">
<pre>法律行为系一种法律事实，其要素为意思表示，并依该意思表示的内容而发生一定私法上的效果。
法律行为是一种法律事实，但法律事实并非当然即为法律行为。这两个层次不能混淆。
成立和生效要件

法律行为的成立要件有三：

    * 当事人。
    * 标的。标的不见得是一种物；劳务契约中，劳力的给付也是标的，但与物无关。
    * 意思表示。

对应法律行为的成立要件，法律行为的生效要件有：

    * 当事人必须有权利能力与行为能力。“当事人适格”一语会和民事诉讼法混淆，因此以行为能力来作区分即为已足。
    * 标的物可能、合法、妥当、确定。
    * 意思表示健全无瑕疵。

分类

    * 以意思表示个数区分：单方行为、双方行为（契约行为）、共同行为。
    * 以法律行为所生效力区分：债权行为、物权行为。</pre>
</div>
<div title="物权法" modifier="Steve" created="200911080725" tags="法学 民法 法条" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911080725">
<pre>中华人民共和国物权法
（2007年3月16日第十届全国人民代表大会第五次会议通过）

目　　录

　　第一编　总　　则
　　　第一章　基本原则
　　　第二章　物权的设立、变更、转让和消灭
　　　　第一节　不动产登记
　　　　第二节　动产交付
　　　　第三节　其他规定
　　　第三章　物权的保护
　　第二编　所有权
　　　第四章　一般规定
　　　第五章　国家所有权和集体所有权、私人所有权
　　　第六章　业主的建筑物区分所有权
　　　第七章　相邻关系
　　　第八章　共　　有
　　　第九章　所有权取得的特别规定
　　第三编　用益物权
　　　第十章　一般规定
　　　第十一章　土地承包经营权
　　　第十二章　建设用地使用权
　　　第十三章　宅基地使用权
　　　第十四章　地役权
　　第四编　担保物权
　　　第十五章　一般规定
　　　第十六章　抵押权
　　　　第一节　一般抵押权
　　　　第二节　最高额抵押权
　　　第十七章　质　　权
　　　　第一节　动产质权
　　　　第二节　权利质权
　　　第十八章　留置权
　　第五编　占　　有
　　　第十九章　占　　有
　　附　　则

第一编　总　　则

第一章　基本原则

　　第一条　为了维护国家基本经济制度，维护社会主义市场经济秩序，明确物的归属，发挥物的效用，保护权利人的物权，根据宪法，制定本法。
　　第二条　因物的归属和利用而产生的民事关系，适用本法。
　　本法所称物，包括不动产和动产。法律规定权利作为物权客体的，依照其规定。
　　本法所称物权，是指权利人依法对特定的物享有直接支配和排他的权利，包括所有权、用益物权和担保物权。
　　第三条　国家在社会主义初级阶段，坚持公有制为主体、多种所有制经济共同发展的基本经济制度。
　　国家巩固和发展公有制经济，鼓励、支持和引导非公有制经济的发展。
　　国家实行社会主义市场经济，保障一切市场主体的平等法律地位和发展权利。
　　第四条　国家、集体、私人的物权和其他权利人的物权受法律保护，任何单位和个人不得侵犯。
　　第五条　物权的种类和内容，由法律规定。
　　第六条　不动产物权的设立、变更、转让和消灭，应当依照法律规定登记。动产物权的设立和转让，应当依照法律规定交付。
　　第七条　物权的取得和行使，应当遵守法律，尊重社会公德，不得损害公共利益和他人合法权益。
　　第八条　其他相关法律对物权另有特别规定的，依照其规定。

第二章　物权的设立、变更、转让和消灭

第一节　不动产登记

　　第九条　不动产物权的设立、变更、转让和消灭，经依法登记，发生效力；未经登记，不发生效力，但法律另有规定的除外。
　　依法属于国家所有的自然资源，所有权可以不登记。
　　第十条　不动产登记，由不动产所在地的登记机构办理。
　　国家对不动产实行统一登记制度。统一登记的范围、登记机构和登记办法，由法律、行政法规规定。
　　第十一条　当事人申请登记，应当根据不同登记事项提供权属证明和不动产界址、面积等必要材料。
　　第十二条　登记机构应当履行下列职责：
　　（一）查验申请人提供的权属证明和其他必要材料；
　　（二）就有关登记事项询问申请人；
　　（三）如实、及时登记有关事项；
　　（四）法律、行政法规规定的其他职责。
　　申请登记的不动产的有关情况需要进一步证明的，登记机构可以要求申请人补充材料，必要时可以实地查看。
　　第十三条　登记机构不得有下列行为：
　　（一）要求对不动产进行评估；
　　（二）以年检等名义进行重复登记；
　　（三）超出登记职责范围的其他行为。
　　第十四条　不动产物权的设立、变更、转让和消灭，依照法律规定应当登记的，自记载于不动产登记簿时发生效力。
　　第十五条　当事人之间订立有关设立、变更、转让和消灭不动产物权的合同，除法律另有规定或者合同另有约定外，自合同成立时生效；未办理物权登记的，不影响合同效力。
　　第十六条　不动产登记簿是物权归属和内容的根据。不动产登记簿由登记机构管理。
　　第十七条　不动产权属证书是权利人享有该不动产物权的证明。不动产权属证书记载的事项，应当与不动产登记簿一致；记载不一致的，除有证据证明不动产登记簿确有错误外，以不动产登记簿为准。
　　第十八条　权利人、利害关系人可以申请查询、复制登记资料，登记机构应当提供。
　　第十九条　权利人、利害关系人认为不动产登记簿记载的事项错误的，可以申请更正登记。不动产登记簿记载的权利人书面同意更正或者有证据证明登记确有错误的，登记机构应当予以更正。
　　不动产登记簿记载的权利人不同意更正的，利害关系人可以申请异议登记。登记机构予以异议登记的，申请人在异议登记之日起十五日内不起诉，异议登记失效。异议登记不当，造成权利人损害的，权利人可以向申请人请求损害赔偿。
　　第二十条　当事人签订买卖房屋或者其他不动产物权的协议，为保障将来实现物权，按照约定可以向登记机构申请预告登记。预告登记后，未经预告登记的权利人同意，处分该不动产的，不发生物权效力。
　　预告登记后，债权消灭或者自能够进行不动产登记之日起三个月内未申请登记的，预告登记失效。
　　第二十一条　当事人提供虚假材料申请登记，给他人造成损害的，应当承担赔偿责任。
　　因登记错误，给他人造成损害的，登记机构应当承担赔偿责任。登记机构赔偿后，可以向造成登记错误的人追偿。
　　第二十二条　不动产登记费按件收取，不得按照不动产的面积、体积或者价款的比例收取。具体收费标准由国务院有关部门会同价格主管部门规定。

第二节　动产交付

　　第二十三条　动产物权的设立和转让，自交付时发生效力，但法律另有规定的除外。
　　第二十四条　船舶、航空器和机动车等物权的设立、变更、转让和消灭，未经登记，不得对抗善意第三人。
　　第二十五条　动产物权设立和转让前，权利人已经依法占有该动产的，物权自法律行为生效时发生效力。
　　第二十六条　动产物权设立和转让前，第三人依法占有该动产的，负有交付义务的人可以通过转让请求第三人返还原物的权利代替交付。
　　第二十七条　动产物权转让时，双方又约定由出让人继续占有该动产的，物权自该约定生效时发生效力。

第三节　其他规定

　　第二十八条　因人民法院、仲裁委员会的法律文书或者人民政府的征收决定等，导致物权设立、变更、转让或者消灭的，自法律文书或者人民政府的征收决定等生效时发生效力。
　　第二十九条　因继承或者受遗赠取得物权的，自继承或者受遗赠开始时发生效力。
　　第三十条　因合法建造、拆除房屋等事实行为设立或者消灭物权的，自事实行为成就时发生效力。
　　第三十一条　依照本法第二十八条至第三十条规定享有不动产物权的，处分该物权时，依照法律规定需要办理登记的，未经登记，不发生物权效力。

第三章　物权的保护

　　第三十二条　物权受到侵害的，权利人可以通过和解、调解、仲裁、诉讼等途径解决。
　　第三十三条　因物权的归属、内容发生争议的，利害关系人可以请求确认权利。
　　第三十四条　无权占有不动产或者动产的，权利人可以请求返还原物。
　　第三十五条　妨害物权或者可能妨害物权的，权利人可以请求排除妨害或者消除危险。
　　第三十六条　造成不动产或者动产毁损的，权利人可以请求修理、重作、更换或者恢复原状。
　　第三十七条　侵害物权，造成权利人损害的，权利人可以请求损害赔偿，也可以请求承担其他民事责任。
　　第三十八条　本章规定的物权保护方式，可以单独适用，也可以根据权利被侵害的情形合并适用。
　　侵害物权，除承担民事责任外，违反行政管理规定的，依法承担行政责任；构成犯罪的，依法追究刑事责任。

第二编　所有权

第四章　一般规定

　　第三十九条　所有权人对自己的不动产或者动产，依法享有占有、使用、收益和处分的权利。
　　第四十条　所有权人有权在自己的不动产或者动产上设立用益物权和担保物权。用益物权人、担保物权人行使权利，不得损害所有权人的权益。
　　第四十一条　法律规定专属于国家所有的不动产和动产，任何单位和个人不能取得所有权。
　　第四十二条　为了公共利益的需要，依照法律规定的权限和程序可以征收集体所有的土地和单位、个人的房屋及其他不动产。
　　征收集体所有的土地，应当依法足额支付土地补偿费、安置补助费、地上附着物和青苗的补偿费等费用，安排被征地农民的社会保障费用，保障被征地农民的生活，维护被征地农民的合法权益。
　　征收单位、个人的房屋及其他不动产，应当依法给予拆迁补偿，维护被征收人的合法权益；征收个人住宅的，还应当保障被征收人的居住条件。
　　任何单位和个人不得贪污、挪用、私分、截留、拖欠征收补偿费等费用。
　　第四十三条　国家对耕地实行特殊保护，严格限制农用地转为建设用地，控制建设用地总量。不得违反法律规定的权限和程序征收集体所有的土地。
　　第四十四条　因抢险、救灾等紧急需要，依照法律规定的权限和程序可以征用单位、个人的不动产或者动产。被征用的不动产或者动产使用后，应当返还被征用人。单位、个人的不动产或者动产被征用或者征用后毁损、灭失的，应当给予补偿。

第五章　国家所有权和集体所有权、私人所有权

　　第四十五条　法律规定属于国家所有的财产，属于国家所有即全民所有。
　　国有财产由国务院代表国家行使所有权；法律另有规定的，依照其规定。
　　第四十六条　矿藏、水流、海域属于国家所有。
　　第四十七条　城市的土地，属于国家所有。法律规定属于国家所有的农村和城市郊区的土地，属于国家所有。
　　第四十八条　森林、山岭、草原、荒地、滩涂等自然资源，属于国家所有，但法律规定属于集体所有的除外。
　　第四十九条　法律规定属于国家所有的野生动植物资源，属于国家所有。
　　第五十条　无线电频谱资源属于国家所有。
　　第五十一条　法律规定属于国家所有的文物，属于国家所有。
　　第五十二条　国防资产属于国家所有。
　　铁路、公路、电力设施、电信设施和油气管道等基础设施，依照法律规定为国家所有的，属于国家所有。
　　第五十三条　国家机关对其直接支配的不动产和动产，享有占有、使用以及依照法律和国务院的有关规定处分的权利。
　　第五十四条　国家举办的事业单位对其直接支配的不动产和动产，享有占有、使用以及依照法律和国务院的有关规定收益、处分的权利。
　　第五十五条　国家出资的企业，由国务院、地方人民政府依照法律、行政法规规定分别代表国家履行出资人职责，享有出资人权益。
　　第五十六条　国家所有的财产受法律保护，禁止任何单位和个人侵占、哄抢、私分、截留、破坏。
　　第五十七条　履行国有财产管理、监督职责的机构及其工作人员，应当依法加强对国有财产的管理、监督，促进国有财产保值增值，防止国有财产损失；滥用职权，玩忽职守，造成国有财产损失的，应当依法承担法律责任。
　　违反国有财产管理规定，在企业改制、合并分立、关联交易等过程中，低价转让、合谋私分、擅自担保或者以其他方式造成国有财产损失的，应当依法承担法律责任。
　　第五十八条　集体所有的不动产和动产包括：
　　（一）法律规定属于集体所有的土地和森林、山岭、草原、荒地、滩涂；
　　（二）集体所有的建筑物、生产设施、农田水利设施；
　　（三）集体所有的教育、科学、文化、卫生、体育等设施；
　　（四）集体所有的其他不动产和动产。
　　第五十九条　农民集体所有的不动产和动产，属于本集体成员集体所有。
　　下列事项应当依照法定程序经本集体成员决定：
　　（一）土地承包方案以及将土地发包给本集体以外的单位或者个人承包；
　　（二）个别土地承包经营权人之间承包地的调整；
　　（三）土地补偿费等费用的使用、分配办法；
　　（四）集体出资的企业的所有权变动等事项；
　　（五）法律规定的其他事项。
　　第六十条　对于集体所有的土地和森林、山岭、草原、荒地、滩涂等，依照下列规定行使所有权：
　　（一）属于村农民集体所有的，由村集体经济组织或者村民委员会代表集体行使所有权；
　　（二）分别属于村内两个以上农民集体所有的，由村内各该集体经济组织或者村民小组代表集体行使所有权；
　　（三）属于乡镇农民集体所有的，由乡镇集体经济组织代表集体行使所有权。
　　第六十一条　城镇集体所有的不动产和动产，依照法律、行政法规的规定由本集体享有占有、使用、收益和处分的权利。
　　第六十二条　集体经济组织或者村民委员会、村民小组应当依照法律、行政法规以及章程、村规民约向本集体成员公布集体财产的状况。
　　第六十三条　集体所有的财产受法律保护，禁止任何单位和个人侵占、哄抢、私分、破坏。
　　集体经济组织、村民委员会或者其负责人作出的决定侵害集体成员合法权益的，受侵害的集体成员可以请求人民法院予以撤销。
　　第六十四条　私人对其合法的收入、房屋、生活用品、生产工具、原材料等不动产和动产享有所有权。
　　第六十五条　私人合法的储蓄、投资及其收益受法律保护。
　　国家依照法律规定保护私人的继承权及其他合法权益。
　　第六十六条　私人的合法财产受法律保护，禁止任何单位和个人侵占、哄抢、破坏。
　　第六十七条　国家、集体和私人依法可以出资设立有限责任公司、股份有限公司或者其他企业。国家、集体和私人所有的不动产或者动产，投到企业的，由出资人按照约定或者出资比例享有资产收益、重大决策以及选择经营管理者等权利并履行义务。
　　第六十八条　企业法人对其不动产和动产依照法律、行政法规以及章程享有占有、使用、收益和处分的权利。
　　企业法人以外的法人，对其不动产和动产的权利，适用有关法律、行政法规以及章程的规定。
　　第六十九条　社会团体依法所有的不动产和动产，受法律保护。

第六章　业主的建筑物区分所有权

　　第七十条　业主对建筑物内的住宅、经营性用房等专有部分享有所有权，对专有部分以外的共有部分享有共有和共同管理的权利。
　　第七十一条　业主对其建筑物专有部分享有占有、使用、收益和处分的权利。业主行使权利不得危及建筑物的安全，不得损害其他业主的合法权益。
　　第七十二条　业主对建筑物专有部分以外的共有部分，享有权利，承担义务；不得以放弃权利不履行义务。
　　业主转让建筑物内的住宅、经营性用房，其对共有部分享有的共有和共同管理的权利一并转让。
　　第七十三条　建筑区划内的道路，属于业主共有，但属于城镇公共道路的除外。建筑区划内的绿地，属于业主共有，但属于城镇公共绿地或者明示属于个人的除外。建筑区划内的其他公共场所、公用设施和物业服务用房，属于业主共有。
　　第七十四条　建筑区划内，规划用于停放汽车的车位、车库应当首先满足业主的需要。
　　建筑区划内，规划用于停放汽车的车位、车库的归属，由当事人通过出售、附赠或者出租等方式约定。
　　占用业主共有的道路或者其他场地用于停放汽车的车位，属于业主共有。
　　第七十五条　业主可以设立业主大会，选举业主委员会。
　　地方人民政府有关部门应当对设立业主大会和选举业主委员会给予指导和协助。
　　第七十六条　下列事项由业主共同决定：
　　（一）制定和修改业主大会议事规则；
　　（二）制定和修改建筑物及其附属设施的管理规约；
　　（三）选举业主委员会或者更换业主委员会成员；
　　（四）选聘和解聘物业服务企业或者其他管理人；
　　（五）筹集和使用建筑物及其附属设施的维修资金；
　　（六）改建、重建建筑物及其附属设施；
　　（七）有关共有和共同管理权利的其他重大事项。
　　决定前款第五项和第六项规定的事项，应当经专有部分占建筑物总面积三分之二以上的业主且占总人数三分之二以上的业主同意。决定前款其他事项，应当经专有部分占建筑物总面积过半数的业主且占总人数过半数的业主同意。
　　第七十七条　业主不得违反法律、法规以及管理规约，将住宅改变为经营性用房。业主将住宅改变为经营性用房的，除遵守法律、法规以及管理规约外，应当经有利害关系的业主同意。
　　第七十八条　业主大会或者业主委员会的决定，对业主具有约束力。
　　业主大会或者业主委员会作出的决定侵害业主合法权益的，受侵害的业主可以请求人民法院予以撤销。
　　第七十九条　建筑物及其附属设施的维修资金，属于业主共有。经业主共同决定，可以用于电梯、水箱等共有部分的维修。维修资金的筹集、使用情况应当公布。
　　第八十条　建筑物及其附属设施的费用分摊、收益分配等事项，有约定的，按照约定；没有约定或者约定不明确的，按照业主专有部分占建筑物总面积的比例确定。
　　第八十一条　业主可以自行管理建筑物及其附属设施，也可以委托物业服务企业或者其他管理人管理。
　　对建设单位聘请的物业服务企业或者其他管理人，业主有权依法更换。
　　第八十二条　物业服务企业或者其他管理人根据业主的委托管理建筑区划内的建筑物及其附属设施，并接受业主的监督。
　　第八十三条　业主应当遵守法律、法规以及管理规约。
　　业主大会和业主委员会，对任意弃置垃圾、排放污染物或者噪声、违反规定饲养动物、违章搭建、侵占通道、拒付物业费等损害他人合法权益的行为，有权依照法律、法规以及管理规约，要求行为人停止侵害、消除危险、排除妨害、赔偿损失。业主对侵害自己合法权益的行为，可以依法向人民法院提起诉讼。

第七章　相邻关系

　　第八十四条　不动产的相邻权利人应当按照有利生产、方便生活、团结互助、公平合理的原则，正确处理相邻关系。
　　第八十五条　法律、法规对处理相邻关系有规定的，依照其规定；法律、法规没有规定的，可以按照当地习惯。
　　第八十六条　不动产权利人应当为相邻权利人用水、排水提供必要的便利。
　　对自然流水的利用，应当在不动产的相邻权利人之间合理分配。对自然流水的排放，应当尊重自然流向。
　　第八十七条　不动产权利人对相邻权利人因通行等必须利用其土地的，应当提供必要的便利。
　　第八十八条　不动产权利人因建造、修缮建筑物以及铺设电线、电缆、水管、暖气和燃气管线等必须利用相邻土地、建筑物的，该土地、建筑物的权利人应当提供必要的便利。
　　第八十九条　建造建筑物，不得违反国家有关工程建设标准，妨碍相邻建筑物的通风、采光和日照。
　　第九十条　不动产权利人不得违反国家规定弃置固体废物，排放大气污染物、水污染物、噪声、光、电磁波辐射等有害物质。
　　第九十一条　不动产权利人挖掘土地、建造建筑物、铺设管线以及安装设备等，不得危及相邻不动产的安全。
　　第九十二条　不动产权利人因用水、排水、通行、铺设管线等利用相邻不动产的，应当尽量避免对相邻的不动产权利人造成损害；造成损害的，应当给予赔偿。

第八章　共　　有

　　第九十三条　不动产或者动产可以由两个以上单位、个人共有。共有包括按份共有和共同共有。
　　第九十四条　按份共有人对共有的不动产或者动产按照其份额享有所有权。
　　第九十五条　共同共有人对共有的不动产或者动产共同享有所有权。
　　第九十六条　共有人按照约定管理共有的不动产或者动产；没有约定或者约定不明确的，各共有人都有管理的权利和义务。
　　第九十七条　处分共有的不动产或者动产以及对共有的不动产或者动产作重大修缮的，应当经占份额三分之二以上的按份共有人或者全体共同共有人同意，但共有人之间另有约定的除外。
　　第九十八条　对共有物的管理费用以及其他负担，有约定的，按照约定；没有约定或者约定不明确的，按份共有人按照其份额负担，共同共有人共同负担。
　　第九十九条　共有人约定不得分割共有的不动产或者动产，以维持共有关系的，应当按照约定，但共有人有重大理由需要分割的，可以请求分割；没有约定或者约定不明确的，按份共有人可以随时请求分割，共同共有人在共有的基础丧失或者有重大理由需要分割时可以请求分割。因分割对其他共有人造成损害的，应当给予赔偿。
　　第一百条　共有人可以协商确定分割方式。达不成协议，共有的不动产或者动产可以分割并且不会因分割减损价值的，应当对实物予以分割；难以分割或者因分割会减损价值的，应当对折价或者拍卖、变卖取得的价款予以分割。
　　共有人分割所得的不动产或者动产有瑕疵的，其他共有人应当分担损失。
　　第一百零一条　按份共有人可以转让其享有的共有的不动产或者动产份额。其他共有人在同等条件下享有优先购买的权利。
　　第一百零二条　因共有的不动产或者动产产生的债权债务，在对外关系上，共有人享有连带债权、承担连带债务，但法律另有规定或者第三人知道共有人不具有连带债权债务关系的除外；在共有人内部关系上，除共有人另有约定外，按份共有人按照份额享有债权、承担债务，共同共有人共同享有债权、承担债务。偿还债务超过自己应当承担份额的按份共有人，有权向其他共有人追偿。
　　第一百零三条　共有人对共有的不动产或者动产没有约定为按份共有或者共同共有，或者约定不明确的，除共有人具有家庭关系等外，视为按份共有。
　　第一百零四条　按份共有人对共有的不动产或者动产享有的份额，没有约定或者约定不明确的，按照出资额确定；不能确定出资额的，视为等额享有。
　　第一百零五条　两个以上单位、个人共同享有用益物权、担保物权的，参照本章规定。

第九章　所有权取得的特别规定

　　第一百零六条　无处分权人将不动产或者动产转让给受让人的，所有权人有权追回；除法律另有规定外，符合下列情形的，受让人取得该不动产或者动产的所有权：
　　（一）受让人受让该不动产或者动产时是善意的；
　　（二）以合理的价格转让；
　　（三）转让的不动产或者动产依照法律规定应当登记的已经登记，不需要登记的已经交付给受让人。
　　受让人依照前款规定取得不动产或者动产的所有权的，原所有权人有权向无处分权人请求赔偿损失。
　　当事人善意取得其他物权的，参照前两款规定。
　　第一百零七条　所有权人或者其他权利人有权追回遗失物。该遗失物通过转让被他人占有的，权利人有权向无处分权人请求损害赔偿，或者自知道或者应当知道受让人之日起二年内向受让人请求返还原物，但受让人通过拍卖或者向具有经营资格的经营者购得该遗失物的，权利人请求返还原物时应当支付受让人所付的费用。权利人向受让人支付所付费用后，有权向无处分权人追偿。
　　第一百零八条　善意受让人取得动产后，该动产上的原有权利消灭，但善意受让人在受让时知道或者应当知道该权利的除外。
　　第一百零九条　拾得遗失物，应当返还权利人。拾得人应当及时通知权利人领取，或者送交公安等有关部门。
　　第一百一十条　有关部门收到遗失物，知道权利人的，应当及时通知其领取；不知道的，应当及时发布招领公告。
　　第一百一十一条　拾得人在遗失物送交有关部门前，有关部门在遗失物被领取前，应当妥善保管遗失物。因故意或者重大过失致使遗失物毁损、灭失的，应当承担民事责任。
　　第一百一十二条　权利人领取遗失物时，应当向拾得人或者有关部门支付保管遗失物等支出的必要费用。
　　权利人悬赏寻找遗失物的，领取遗失物时应当按照承诺履行义务。
　　拾得人侵占遗失物的，无权请求保管遗失物等支出的费用，也无权请求权利人按照承诺履行义务。
　　第一百一十三条　遗失物自发布招领公告之日起六个月内无人认领的，归国家所有。
　　第一百一十四条　拾得漂流物、发现埋藏物或者隐藏物的，参照拾得遗失物的有关规定。文物保护法等法律另有规定的，依照其规定。
　　第一百一十五条　主物转让的，从物随主物转让，但当事人另有约定的除外。
　　第一百一十六条　天然孳息，由所有权人取得；既有所有权人又有用益物权人的，由用益物权人取得。当事人另有约定的，按照约定。
　　法定孳息，当事人有约定的，按照约定取得；没有约定或者约定不明确的，按照交易习惯取得。

第三编　用益物权

第十章　一般规定

　　第一百一十七条　用益物权人对他人所有的不动产或者动产，依法享有占有、使用和收益的权利。
　　第一百一十八条　国家所有或者国家所有由集体使用以及法律规定属于集体所有的自然资源，单位、个人依法可以占有、使用和收益。
　　第一百一十九条　国家实行自然资源有偿使用制度，但法律另有规定的除外。
　　第一百二十条　用益物权人行使权利，应当遵守法律有关保护和合理开发利用资源的规定。所有权人不得干涉用益物权人行使权利。
　　第一百二十一条　因不动产或者动产被征收、征用致使用益物权消灭或者影响用益物权行使的，用益物权人有权依照本法第四十二条、第四十四条的规定获得相应补偿。
　　第一百二十二条　依法取得的海域使用权受法律保护。
　　第一百二十三条　依法取得的探矿权、采矿权、取水权和使用水域、滩涂从事养殖、捕捞的权利受法律保护。

第十一章　土地承包经营权

　　第一百二十四条　农村集体经济组织实行家庭承包经营为基础、统分结合的双层经营体制。
　　农民集体所有和国家所有由农民集体使用的耕地、林地、草地以及其他用于农业的土地，依法实行土地承包经营制度。
　　第一百二十五条　土地承包经营权人依法对其承包经营的耕地、林地、草地等享有占有、使用和收益的权利，有权从事种植业、林业、畜牧业等农业生产。
　　第一百二十六条　耕地的承包期为三十年。草地的承包期为三十年至五十年。林地的承包期为三十年至七十年；特殊林木的林地承包期，经国务院林业行政主管部门批准可以延长。
　　前款规定的承包期届满，由土地承包经营权人按照国家有关规定继续承包。
　　第一百二十七条　土地承包经营权自土地承包经营权合同生效时设立。
　　县级以上地方人民政府应当向土地承包经营权人发放土地承包经营权证、林权证、草原使用权证，并登记造册，确认土地承包经营权。
　　第一百二十八条　土地承包经营权人依照农村土地承包法的规定，有权将土地承包经营权采取转包、互换、转让等方式流转。流转的期限不得超过承包期的剩余期限。未经依法批准，不得将承包地用于非农建设。
　　第一百二十九条　土地承包经营权人将土地承包经营权互换、转让，当事人要求登记的，应当向县级以上地方人民政府申请土地承包经营权变更登记；未经登记，不得对抗善意第三人。
　　第一百三十条　承包期内发包人不得调整承包地。
　　因自然灾害严重毁损承包地等特殊情形，需要适当调整承包的耕地和草地的，应当依照农村土地承包法等法律规定办理。
　　第一百三十一条　承包期内发包人不得收回承包地。农村土地承包法等法律另有规定的，依照其规定。
　　第一百三十二条　承包地被征收的，土地承包经营权人有权依照本法第四十二条第二款的规定获得相应补偿。
　　第一百三十三条　通过招标、拍卖、公开协商等方式承包荒地等农村土地，依照农村土地承包法等法律和国务院的有关规定，其土地承包经营权可以转让、入股、抵押或者以其他方式流转。
　　第一百三十四条　国家所有的农用地实行承包经营的，参照本法的有关规定。

第十二章　建设用地使用权

　　第一百三十五条　建设用地使用权人依法对国家所有的土地享有占有、使用和收益的权利，有权利用该土地建造建筑物、构筑物及其附属设施。
　　第一百三十六条　建设用地使用权可以在土地的地表、地上或者地下分别设立。新设立的建设用地使用权，不得损害已设立的用益物权。
　　第一百三十七条　设立建设用地使用权，可以采取出让或者划拨等方式。
　　工业、商业、旅游、娱乐和商品住宅等经营性用地以及同一土地有两个以上意向用地者的，应当采取招标、拍卖等公开竞价的方式出让。
　　严格限制以划拨方式设立建设用地使用权。采取划拨方式的，应当遵守法律、行政法规关于土地用途的规定。
　　第一百三十八条　采取招标、拍卖、协议等出让方式设立建设用地使用权的，当事人应当采取书面形式订立建设用地使用权出让合同。
　　建设用地使用权出让合同一般包括下列条款：
　　（一）当事人的名称和住所；
　　（二）土地界址、面积等；
　　（三）建筑物、构筑物及其附属设施占用的空间；
　　（四）土地用途；
　　（五）使用期限；
　　（六）出让金等费用及其支付方式；
　　（七）解决争议的方法。
　　第一百三十九条　设立建设用地使用权的，应当向登记机构申请建设用地使用权登记。建设用地使用权自登记时设立。登记机构应当向建设用地使用权人发放建设用地使用权证书。
　　第一百四十条　建设用地使用权人应当合理利用土地，不得改变土地用途；需要改变土地用途的，应当依法经有关行政主管部门批准。
　　第一百四十一条　建设用地使用权人应当依照法律规定以及合同约定支付出让金等费用。
　　第一百四十二条　建设用地使用权人建造的建筑物、构筑物及其附属设施的所有权属于建设用地使用权人，但有相反证据证明的除外。
　　第一百四十三条　建设用地使用权人有权将建设用地使用权转让、互换、出资、赠与或者抵押，但法律另有规定的除外。
　　第一百四十四条　建设用地使用权转让、互换、出资、赠与或者抵押的，当事人应当采取书面形式订立相应的合同。使用期限由当事人约定，但不得超过建设用地使用权的剩余期限。
　　第一百四十五条　建设用地使用权转让、互换、出资或者赠与的，应当向登记机构申请变更登记。
　　第一百四十六条　建设用地使用权转让、互换、出资或者赠与的，附着于该土地上的建筑物、构筑物及其附属设施一并处分。
　　第一百四十七条　建筑物、构筑物及其附属设施转让、互换、出资或者赠与的，该建筑物、构筑物及其附属设施占用范围内的建设用地使用权一并处分。
　　第一百四十八条　建设用地使用权期间届满前，因公共利益需要提前收回该土地的，应当依照本法第四十二条的规定对该土地上的房屋及其他不动产给予补偿，并退还相应的出让金。
　　第一百四十九条　住宅建设用地使用权期间届满的，自动续期。
　　非住宅建设用地使用权期间届满后的续期，依照法律规定办理。该土地上的房屋及其他不动产的归属，有约定的，按照约定；没有约定或者约定不明确的，依照法律、行政法规的规定办理。
　　第一百五十条　建设用地使用权消灭的，出让人应当及时办理注销登记。登记机构应当收回建设用地使用权证书。
　　第一百五十一条　集体所有的土地作为建设用地的，应当依照土地管理法等法律规定办理。

第十三章　宅基地使用权

　　第一百五十二条　宅基地使用权人依法对集体所有的土地享有占有和使用的权利，有权依法利用该土地建造住宅及其附属设施。
　　第一百五十三条　宅基地使用权的取得、行使和转让，适用土地管理法等法律和国家有关规定。
　　第一百五十四条　宅基地因自然灾害等原因灭失的，宅基地使用权消灭。对失去宅基地的村民，应当重新分配宅基地。
　　第一百五十五条　已经登记的宅基地使用权转让或者消灭的，应当及时办理变更登记或者注销登记。

第十四章　地役权

　　第一百五十六条　地役权人有权按照合同约定，利用他人的不动产,以提高自己的不动产的效益。
　　前款所称他人的不动产为供役地，自己的不动产为需役地。
　　第一百五十七条　设立地役权，当事人应当采取书面形式订立地役权合同。
　　地役权合同一般包括下列条款：
　　（一）当事人的姓名或者名称和住所；
　　（二）供役地和需役地的位置；
　　（三）利用目的和方法；
　　（四）利用期限；
　　（五）费用及其支付方式；
　　（六）解决争议的方法。
　　第一百五十八条　地役权自地役权合同生效时设立。当事人要求登记的，可以向登记机构申请地役权登记；未经登记，不得对抗善意第三人。
　　第一百五十九条　供役地权利人应当按照合同约定，允许地役权人利用其土地，不得妨害地役权人行使权利。
　　第一百六十条　地役权人应当按照合同约定的利用目的和方法利用供役地，尽量减少对供役地权利人物权的限制。
　　第一百六十一条　地役权的期限由当事人约定，但不得超过土地承包经营权、建设用地使用权等用益物权的剩余期限。
　　第一百六十二条　土地所有权人享有地役权或者负担地役权的，设立土地承包经营权、宅基地使用权时，该土地承包经营权人、宅基地使用权人继续享有或者负担已设立的地役权。
　　第一百六十三条　土地上已设立土地承包经营权、建设用地使用权、宅基地使用权等权利的，未经用益物权人同意，土地所有权人不得设立地役权。
　　第一百六十四条　地役权不得单独转让。土地承包经营权、建设用地使用权等转让的，地役权一并转让，但合同另有约定的除外。
　　第一百六十五条　地役权不得单独抵押。土地承包经营权、建设用地使用权等抵押的，在实现抵押权时，地役权一并转让。
　　第一百六十六条　需役地以及需役地上的土地承包经营权、建设用地使用权部分转让时，转让部分涉及地役权的，受让人同时享有地役权。
　　第一百六十七条　供役地以及供役地上的土地承包经营权、建设用地使用权部分转让时，转让部分涉及地役权的，地役权对受让人具有约束力。
　　第一百六十八条　地役权人有下列情形之一的，供役地权利人有权解除地役权合同，地役权消灭：
　　（一）违反法律规定或者合同约定，滥用地役权；
　　（二）有偿利用供役地，约定的付款期间届满后在合理期限内经两次催告未支付费用。
　　第一百六十九条　已经登记的地役权变更、转让或者消灭的，应当及时办理变更登记或者注销登记。

第四编　担保物权

第十五章　一般规定

　　第一百七十条　担保物权人在债务人不履行到期债务或者发生当事人约定的实现担保物权的情形，依法享有就担保财产优先受偿的权利，但法律另有规定的除外。
　　第一百七十一条　债权人在借贷、买卖等民事活动中，为保障实现其债权，需要担保的，可以依照本法和其他法律的规定设立担保物权。
　　第三人为债务人向债权人提供担保的，可以要求债务人提供反担保。反担保适用本法和其他法律的规定。
　　第一百七十二条　设立担保物权，应当依照本法和其他法律的规定订立担保合同。担保合同是主债权债务合同的从合同。主债权债务合同无效，担保合同无效，但法律另有规定的除外。
　　担保合同被确认无效后，债务人、担保人、债权人有过错的，应当根据其过错各自承担相应的民事责任。
　　第一百七十三条　担保物权的担保范围包括主债权及其利息、违约金、损害赔偿金、保管担保财产和实现担保物权的费用。当事人另有约定的，按照约定。
　　第一百七十四条　担保期间，担保财产毁损、灭失或者被征收等，担保物权人可以就获得的保险金、赔偿金或者补偿金等优先受偿。被担保债权的履行期未届满的，也可以提存该保险金、赔偿金或者补偿金等。
　　第一百七十五条　第三人提供担保，未经其书面同意，债权人允许债务人转移全部或者部分债务的，担保人不再承担相应的担保责任。
　　第一百七十六条　被担保的债权既有物的担保又有人的担保的，债务人不履行到期债务或者发生当事人约定的实现担保物权的情形，债权人应当按照约定实现债权；没有约定或者约定不明确，债务人自己提供物的担保的，债权人应当先就该物的担保实现债权；第三人提供物的担保的，债权人可以就物的担保实现债权，也可以要求保证人承担保证责任。提供担保的第三人承担担保责任后，有权向债务人追偿。
　　第一百七十七条　有下列情形之一的，担保物权消灭：
　　（一）主债权消灭；
　　（二）担保物权实现；
　　（三）债权人放弃担保物权；
　　（四）法律规定担保物权消灭的其他情形。
　　第一百七十八条　担保法与本法的规定不一致的，适用本法。

第十六章　抵押权

第一节　一般抵押权

　　第一百七十九条　为担保债务的履行，债务人或者第三人不转移财产的占有，将该财产抵押给债权人的，债务人不履行到期债务或者发生当事人约定的实现抵押权的情形，债权人有权就该财产优先受偿。
　　前款规定的债务人或者第三人为抵押人，债权人为抵押权人，提供担保的财产为抵押财产。
　　第一百八十条　债务人或者第三人有权处分的下列财产可以抵押：
　　（一）建筑物和其他土地附着物；
　　（二）建设用地使用权；
　　（三）以招标、拍卖、公开协商等方式取得的荒地等土地承包经营权；
　　（四）生产设备、原材料、半成品、产品；
　　（五）正在建造的建筑物、船舶、航空器；
　　（六）交通运输工具；
　　（七）法律、行政法规未禁止抵押的其他财产。
　　抵押人可以将前款所列财产一并抵押。
　　第一百八十一条　经当事人书面协议，企业、个体工商户、农业生产经营者可以将现有的以及将有的生产设备、原材料、半成品、产品抵押，债务人不履行到期债务或者发生当事人约定的实现抵押权的情形，债权人有权就实现抵押权时的动产优先受偿。
　　第一百八十二条　以建筑物抵押的，该建筑物占用范围内的建设用地使用权一并抵押。以建设用地使用权抵押的，该土地上的建筑物一并抵押。
　　抵押人未依照前款规定一并抵押的，未抵押的财产视为一并抵押。
　　第一百八十三条　乡镇、村企业的建设用地使用权不得单独抵押。以乡镇、村企业的厂房等建筑物抵押的，其占用范围内的建设用地使用权一并抵押。
　　第一百八十四条　下列财产不得抵押：
　　（一）土地所有权；
　　（二）耕地、宅基地、自留地、自留山等集体所有的土地使用权，但法律规定可以抵押的除外；
　　（三）学校、幼儿园、医院等以公益为目的的事业单位、社会团体的教育设施、医疗卫生设施和其他社会公益设施；
　　（四）所有权、使用权不明或者有争议的财产；
　　（五）依法被查封、扣押、监管的财产；
　　（六）法律、行政法规规定不得抵押的其他财产。
　　第一百八十五条　设立抵押权，当事人应当采取书面形式订立抵押合同。
　　抵押合同一般包括下列条款：
　　（一）被担保债权的种类和数额；
　　（二）债务人履行债务的期限；
　　（三）抵押财产的名称、数量、质量、状况、所在地、所有权归属或者使用权归属；
　　（四）担保的范围。
　　第一百八十六条　抵押权人在债务履行期届满前，不得与抵押人约定债务人不履行到期债务时抵押财产归债权人所有。
　　第一百八十七条　以本法第一百八十条第一款第一项至第三项规定的财产或者第五项规定的正在建造的建筑物抵押的，应当办理抵押登记。抵押权自登记时设立。
　　第一百八十八条　以本法第一百八十条第一款第四项、第六项规定的财产或者第五项规定的正在建造的船舶、航空器抵押的，抵押权自抵押合同生效时设立；未经登记，不得对抗善意第三人。
　　第一百八十九条　企业、个体工商户、农业生产经营者以本法第一百八十一条规定的动产抵押的，应当向抵押人住所地的工商行政管理部门办理登记。抵押权自抵押合同生效时设立；未经登记，不得对抗善意第三人。
　　依照本法第一百八十一条规定抵押的，不得对抗正常经营活动中已支付合理价款并取得抵押财产的买受人。
　　第一百九十条　订立抵押合同前抵押财产已出租的，原租赁关系不受该抵押权的影响。抵押权设立后抵押财产出租的，该租赁关系不得对抗已登记的抵押权。
　　第一百九十一条　抵押期间，抵押人经抵押权人同意转让抵押财产的，应当将转让所得的价款向抵押权人提前清偿债务或者提存。转让的价款超过债权数额的部分归抵押人所有，不足部分由债务人清偿。
　　抵押期间，抵押人未经抵押权人同意，不得转让抵押财产，但受让人代为清偿债务消灭抵押权的除外。
　　第一百九十二条　抵押权不得与债权分离而单独转让或者作为其他债权的担保。债权转让的，担保该债权的抵押权一并转让，但法律另有规定或者当事人另有约定的除外。
　　第一百九十三条　抵押人的行为足以使抵押财产价值减少的，抵押权人有权要求抵押人停止其行为。抵押财产价值减少的，抵押权人有权要求恢复抵押财产的价值，或者提供与减少的价值相应的担保。抵押人不恢复抵押财产的价值也不提供担保的，抵押权人有权要求债务人提前清偿债务。
　　第一百九十四条　抵押权人可以放弃抵押权或者抵押权的顺位。抵押权人与抵押人可以协议变更抵押权顺位以及被担保的债权数额等内容，但抵押权的变更，未经其他抵押权人书面同意，不得对其他抵押权人产生不利影响。
　　债务人以自己的财产设定抵押，抵押权人放弃该抵押权、抵押权顺位或者变更抵押权的，其他担保人在抵押权人丧失优先受偿权益的范围内免除担保责任，但其他担保人承诺仍然提供担保的除外。
　　第一百九十五条　债务人不履行到期债务或者发生当事人约定的实现抵押权的情形，抵押权人可以与抵押人协议以抵押财产折价或者以拍卖、变卖该抵押财产所得的价款优先受偿。协议损害其他债权人利益的，其他债权人可以在知道或者应当知道撤销事由之日起一年内请求人民法院撤销该协议。
　　抵押权人与抵押人未就抵押权实现方式达成协议的，抵押权人可以请求人民法院拍卖、变卖抵押财产。
　　抵押财产折价或者变卖的，应当参照市场价格。
　　第一百九十六条　依照本法第一百八十一条规定设定抵押的，抵押财产自下列情形之一发生时确定：
　　（一）债务履行期届满，债权未实现；
　　（二）抵押人被宣告破产或者被撤销；
　　（三）当事人约定的实现抵押权的情形；
　　（四）严重影响债权实现的其他情形。
　　第一百九十七条　债务人不履行到期债务或者发生当事人约定的实现抵押权的情形，致使抵押财产被人民法院依法扣押的，自扣押之日起抵押权人有权收取该抵押财产的天然孳息或者法定孳息，但抵押权人未通知应当清偿法定孳息的义务人的除外。
　　前款规定的孳息应当先充抵收取孳息的费用。
　　第一百九十八条　抵押财产折价或者拍卖、变卖后，其价款超过债权数额的部分归抵押人所有，不足部分由债务人清偿。
　　第一百九十九条　同一财产向两个以上债权人抵押的，拍卖、变卖抵押财产所得的价款依照下列规定清偿：
　　（一）抵押权已登记的，按照登记的先后顺序清偿；顺序相同的，按照债权比例清偿；
　　（二）抵押权已登记的先于未登记的受偿；
　　（三）抵押权未登记的，按照债权比例清偿。
　　第二百条　建设用地使用权抵押后，该土地上新增的建筑物不属于抵押财产。该建设用地使用权实现抵押权时，应当将该土地上新增的建筑物与建设用地使用权一并处分，但新增建筑物所得的价款，抵押权人无权优先受偿。
　　第二百零一条　依照本法第一百八十条第一款第三项规定的土地承包经营权抵押的，或者依照本法第一百八十三条规定以乡镇、村企业的厂房等建筑物占用范围内的建设用地使用权一并抵押的，实现抵押权后，未经法定程序，不得改变土地所有权的性质和土地用途。
　　第二百零二条　抵押权人应当在主债权诉讼时效期间行使抵押权；未行使的，人民法院不予保护。

第二节　最高额抵押权

　　第二百零三条　为担保债务的履行，债务人或者第三人对一定期间内将要连续发生的债权提供担保财产的，债务人不履行到期债务或者发生当事人约定的实现抵押权的情形，抵押权人有权在最高债权额限度内就该担保财产优先受偿。
　　最高额抵押权设立前已经存在的债权，经当事人同意，可以转入最高额抵押担保的债权范围。
　　第二百零四条　最高额抵押担保的债权确定前，部分债权转让的，最高额抵押权不得转让，但当事人另有约定的除外。
　　第二百零五条　最高额抵押担保的债权确定前，抵押权人与抵押人可以通过协议变更债权确定的期间、债权范围以及最高债权额，但变更的内容不得对其他抵押权人产生不利影响。
　　第二百零六条　有下列情形之一的，抵押权人的债权确定：
　　（一）约定的债权确定期间届满；
　　（二）没有约定债权确定期间或者约定不明确，抵押权人或者抵押人自最高额抵押权设立之日起满二年后请求确定债权；
　　（三）新的债权不可能发生；
　　（四）抵押财产被查封、扣押；
　　（五）债务人、抵押人被宣告破产或者被撤销；
　　（六）法律规定债权确定的其他情形。
　　第二百零七条　最高额抵押权除适用本节规定外，适用本章第一节一般抵押权的规定。

第十七章　质　　权

第一节　动产质权

　　第二百零八条　为担保债务的履行，债务人或者第三人将其动产出质给债权人占有的，债务人不履行到期债务或者发生当事人约定的实现质权的情形，债权人有权就该动产优先受偿。
　　前款规定的债务人或者第三人为出质人，债权人为质权人，交付的动产为质押财产。
　　第二百零九条　法律、行政法规禁止转让的动产不得出质。
　　第二百一十条　设立质权，当事人应当采取书面形式订立质权合同。
　　质权合同一般包括下列条款：
　　（一）被担保债权的种类和数额；
　　（二）债务人履行债务的期限；
　　（三）质押财产的名称、数量、质量、状况；
　　（四）担保的范围；
　　（五）质押财产交付的时间。
　　第二百一十一条　质权人在债务履行期届满前，不得与出质人约定债务人不履行到期债务时质押财产归债权人所有。
　　第二百一十二条　质权自出质人交付质押财产时设立。
　　第二百一十三条　质权人有权收取质押财产的孳息，但合同另有约定的除外。
　　前款规定的孳息应当先充抵收取孳息的费用。
　　第二百一十四条　质权人在质权存续期间，未经出质人同意，擅自使用、处分质押财产，给出质人造成损害的，应当承担赔偿责任。
　　第二百一十五条　质权人负有妥善保管质押财产的义务；因保管不善致使质押财产毁损、灭失的，应当承担赔偿责任。
　　质权人的行为可能使质押财产毁损、灭失的，出质人可以要求质权人将质押财产提存，或者要求提前清偿债务并返还质押财产。
　　第二百一十六条　因不能归责于质权人的事由可能使质押财产毁损或者价值明显减少，足以危害质权人权利的，质权人有权要求出质人提供相应的担保；出质人不提供的，质权人可以拍卖、变卖质押财产，并与出质人通过协议将拍卖、变卖所得的价款提前清偿债务或者提存。
　　第二百一十七条　质权人在质权存续期间，未经出质人同意转质，造成质押财产毁损、灭失的，应当向出质人承担赔偿责任。
　　第二百一十八条　质权人可以放弃质权。债务人以自己的财产出质，质权人放弃该质权的，其他担保人在质权人丧失优先受偿权益的范围内免除担保责任，但其他担保人承诺仍然提供担保的除外。
　　第二百一十九条　债务人履行债务或者出质人提前清偿所担保的债权的，质权人应当返还质押财产。
　　债务人不履行到期债务或者发生当事人约定的实现质权的情形，质权人可以与出质人协议以质押财产折价，也可以就拍卖、变卖质押财产所得的价款优先受偿。
　　质押财产折价或者变卖的，应当参照市场价格。
　　第二百二十条　出质人可以请求质权人在债务履行期届满后及时行使质权；质权人不行使的，出质人可以请求人民法院拍卖、变卖质押财产。
　　出质人请求质权人及时行使质权，因质权人怠于行使权利造成损害的，由质权人承担赔偿责任。
　　第二百二十一条　质押财产折价或者拍卖、变卖后，其价款超过债权数额的部分归出质人所有，不足部分由债务人清偿。
　　第二百二十二条　出质人与质权人可以协议设立最高额质权。
　　最高额质权除适用本节有关规定外，参照本法第十六章第二节最高额抵押权的规定。

第二节　权利质权

　　第二百二十三条　债务人或者第三人有权处分的下列权利可以出质：
　　（一）汇票、支票、本票；
　　（二）债券、存款单；
　　（三）仓单、提单；
　　（四）可以转让的基金份额、股权；
　　（五）可以转让的注册商标专用权、专利权、著作权等知识产权中的财产权；
　　（六）应收账款；
　　（七）法律、行政法规规定可以出质的其他财产权利。
　　第二百二十四条　以汇票、支票、本票、债券、存款单、仓单、提单出质的，当事人应当订立书面合同。质权自权利凭证交付质权人时设立；没有权利凭证的，质权自有关部门办理出质登记时设立。
　　第二百二十五条　汇票、支票、本票、债券、存款单、仓单、提单的兑现日期或者提货日期先于主债权到期的，质权人可以兑现或者提货，并与出质人协议将兑现的价款或者提取的货物提前清偿债务或者提存。
　　第二百二十六条　以基金份额、股权出质的，当事人应当订立书面合同。以基金份额、证券登记结算机构登记的股权出质的，质权自证券登记结算机构办理出质登记时设立；以其他股权出质的，质权自工商行政管理部门办理出质登记时设立。
　　基金份额、股权出质后，不得转让，但经出质人与质权人协商同意的除外。出质人转让基金份额、股权所得的价款，应当向质权人提前清偿债务或者提存。
　　第二百二十七条　以注册商标专用权、专利权、著作权等知识产权中的财产权出质的，当事人应当订立书面合同。质权自有关主管部门办理出质登记时设立。
　　知识产权中的财产权出质后，出质人不得转让或者许可他人使用，但经出质人与质权人协商同意的除外。出质人转让或者许可他人使用出质的知识产权中的财产权所得的价款，应当向质权人提前清偿债务或者提存。
　　第二百二十八条　以应收账款出质的，当事人应当订立书面合同。质权自信贷征信机构办理出质登记时设立。
　　应收账款出质后，不得转让，但经出质人与质权人协商同意的除外。出质人转让应收账款所得的价款，应当向质权人提前清偿债务或者提存。
　　第二百二十九条　权利质权除适用本节规定外，适用本章第一节动产质权的规定。

第十八章　留置权

　　第二百三十条　债务人不履行到期债务，债权人可以留置已经合法占有的债务人的动产，并有权就该动产优先受偿。
　　前款规定的债权人为留置权人，占有的动产为留置财产。
　　第二百三十一条　债权人留置的动产，应当与债权属于同一法律关系，但企业之间留置的除外。
　　第二百三十二条　法律规定或者当事人约定不得留置的动产，不得留置。
　　第二百三十三条　留置财产为可分物的，留置财产的价值应当相当于债务的金额。
　　第二百三十四条　留置权人负有妥善保管留置财产的义务；因保管不善致使留置财产毁损、灭失的，应当承担赔偿责任。
　　第二百三十五条　留置权人有权收取留置财产的孳息。
　　前款规定的孳息应当先充抵收取孳息的费用。
　　第二百三十六条　留置权人与债务人应当约定留置财产后的债务履行期间；没有约定或者约定不明确的，留置权人应当给债务人两个月以上履行债务的期间，但鲜活易腐等不易保管的动产除外。债务人逾期未履行的，留置权人可以与债务人协议以留置财产折价，也可以就拍卖、变卖留置财产所得的价款优先受偿。
　　留置财产折价或者变卖的，应当参照市场价格。
　　第二百三十七条　债务人可以请求留置权人在债务履行期届满后行使留置权；留置权人不行使的，债务人可以请求人民法院拍卖、变卖留置财产。
　　第二百三十八条　留置财产折价或者拍卖、变卖后，其价款超过债权数额的部分归债务人所有，不足部分由债务人清偿。
　　第二百三十九条　同一动产上已设立抵押权或者质权，该动产又被留置的，留置权人优先受偿。
　　第二百四十条　留置权人对留置财产丧失占有或者留置权人接受债务人另行提供担保的，留置权消灭。

第五编　占　　有

第十九章　占　　有

　　第二百四十一条　基于合同关系等产生的占有，有关不动产或者动产的使用、收益、违约责任等，按照合同约定；合同没有约定或者约定不明确的，依照有关法律规定。
　　第二百四十二条　占有人因使用占有的不动产或者动产，致使该不动产或者动产受到损害的，恶意占有人应当承担赔偿责任。
　　第二百四十三条　不动产或者动产被占有人占有的，权利人可以请求返还原物及其孳息，但应当支付善意占有人因维护该不动产或者动产支出的必要费用。
　　第二百四十四条　占有的不动产或者动产毁损、灭失，该不动产或者动产的权利人请求赔偿的，占有人应当将因毁损、灭失取得的保险金、赔偿金或者补偿金等返还给权利人；权利人的损害未得到足够弥补的，恶意占有人还应当赔偿损失。
　　第二百四十五条　占有的不动产或者动产被侵占的，占有人有权请求返还原物；对妨害占有的行为，占有人有权请求排除妨害或者消除危险；因侵占或者妨害造成损害的，占有人有权请求损害赔偿。
　　占有人返还原物的请求权，自侵占发生之日起一年内未行使的，该请求权消灭。

附　　则

　　第二百四十六条　法律、行政法规对不动产统一登记的范围、登记机构和登记办法作出规定前，地方性法规可以依照本法有关规定作出规定。
　　第二百四十七条　本法自2007年10月1日起施行。</pre>
</div>
<div title="相邻关系" modifier="Steve" created="200911120841" modified="200911150935" tags="法学 民法 物权" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911150935">
<pre>|!概念|
相邻关系，是指两个或两个以上相互毗邻的不动产所有人或使用人，在占有、使用、受益、处分其不动产时，互相给予对方便利或接受限制的权利义务关系。

|!法条|
　　[[民法通则]]
　　第八十三条 不动产的相邻各方 ，应当按照有利生产、方便生活、团结互助、公平合理的精神，正确处理截水、排水、通行、通风、采光等方面的相邻关系，给邻方造成妨碍或损失的，应当停止侵害，排除妨碍，赔偿损失。
　　[[物权法]]
　　第七章 相邻关系
　　第八十四条 不动产的相邻权利人应当按照有利生产、方便生活、团结互助、公平合理的原则，正确处理相邻关系。
　　第八十五条 法律、法规对处理相邻关系有规定的，依照其规定；法律、法规没有规定的，可以按照当地习惯。
　　第八十六条 不动产权利人应当为相邻权利人用水、排水提供必要的便利。
　　对自然流水的利用，应当在不动产的相邻权利人之间合理分配。对自然流水的排放，应当尊重自然流向。
　　第八十七条 不动产权利人对相邻权利人因通行等必须利用其土地的，应当提供必要的便利。
　　第八十八条 不动产权利人因建造、修缮建筑物以及铺设电线、电缆、水管、暖气和燃气管线等必须利用相邻土地、建筑物的，该土地、建筑物的权利人应当提供必要的便利。
　　第八十九条 建造建筑物，不得违反国家有关工程建设标准，妨碍相邻建筑物的通风、采光和日照。
　　第九十条 不动产权利人不得违反国家规定弃置固体废物，排放大气污染物、水污染物、噪声、光、电磁波辐射等有害物质。
　　第九十一条 不动产权利人挖掘土地、建造建筑物、铺设管线以及安装设备等，不得危及相邻不动产的安全。
　　第九十二条 不动产权利人因用水、排水、通行、铺设管线等利用相邻不动产的，应当尽量避免对相邻的不动产权利人造成损害；造成损害的，应当给予赔偿。

最高人民法院《关于贯彻执行&lt;中华人民共和国民法通则&gt;若干问题的意见（试行）》

     ９７．相邻一方因施工临时占用他方使用的土地，占用的一方如未按照双方约定的范围、用途和期限使用的，应当责令其及时清理现场，排除妨碍，恢复原状，赔偿损失。
　　９８．一方擅自堵截或者独占自然流水，影响他方正常生产、生活的，他方有权请求排除妨碍；造成他方损失的，应负赔偿责任。
　　９９．相邻一方必须使用另一方的土地排水的，应当予以准许；但应在必要限度内使用并采取适当的保护措施排水，如仍造成损失的，由受益人合理补偿。
　　相邻一方可以采取其他合理的措施排水而未采取，向他方土地排水毁损或者可能毁损他方财产，他方要求致害人停止侵害、消除危险、恢复原状、赔偿损失的，应当予以支持。
　　１００．一方必须在相邻一方使用的土地上通行的，应当予以准许；因此造成损失的，应当给予适当补偿。
　　１０１．对于一方所有的或者使用的建筑物范围内历史形成的必经通道，所有权人或者使用权人不得堵塞。因堵塞影响他人生产、生活，他人要求排除妨碍或者恢复原状的，应当予以支持。但有条件另开通道的，也可以另开通道。
　　１０２．处理相邻房屋滴水纠纷时，对有过错的一方造成他方损害的，应当责令其排除妨碍、赔偿损失。
　　１０３．相邻一方在自己使用的土地上挖水沟、水池、地窖等或者种植的竹木根枝伸延，危及另一方建筑物的安全和正常使用的，应当分别情况，责令其消除危险，恢复原状，赔偿损失。

|!构成要件|
1.相邻人
不动产的所有人或使用人又称相邻人
2.相邻权
相邻方享有的要求他人给予方便的权利又称相邻权。相邻权是为调节在行使不动产所有权中的权益冲突而产生的一种权利。

类型化
一、土地通行和占用根据我国《民法通则》的规定和有关司法解释的规定，调整土地通行和占用的相邻关系时应遵循以下基本法律要求：
　　第一、相邻一方因生产和生活的需要必须临时或长期通过另一方使用的土地上的，另一方应当予以准许。因此而给另一方造成损失的，通行一方应当给予适当的补偿。
　　第二、相邻一方因修建施工、架设电线、埋设管道等需要临时占用他方使用的土地的，他方应当允许。占用的一方如果未按照双方约定的范围、用途和期限使用的，应当责令其及时清理现场，排除妨碍，恢复原状，赔偿损失。
　　第三、发生矛盾在经过调解无效时可向法院提出诉讼。
二、建筑物内通行根据我国《民法通则》的规定和有关司法解释的规定，调整建筑物内通行的相邻关系时应遵循以下基本法律要求：
　　第一、对于一方所有的或者使用的建筑物范围内历史形成的必须通道，所有权人或者使用权人不得堵塞。
　　第二、因堵塞而影响他人生产、生活，他人要求排除妨碍或者恢复原状的，应当予以支持。但如果有条件另开通道的，也可以另开通道。
三、用水与排水根据我国《民法通则》的规定和有关司法解释的规定，调整用水与排水的相邻关系时应遵循以下基本法律要求：
　　第一、相邻多方共临同一水源时，各方均可以自由使用水源，但不得影响相邻方的用水。相邻一方擅自堵截、改变水路或者独占自然用水，影响他方正常生产、生活的，他方有权请求排除妨碍，因此造成他方损失的，截水一方应负赔偿责任。
　　第二、相邻一方必须使用另一方的土地排水的，应当予以准许，但排水一方应当在必要限度内使用并采取适当的保护措施。如果因此而给另一方造成损失的，受益人应当给受害人适当的补偿。
　　第三、相邻一方可以采取其他的合理的措施排水而未采取，向他方土地排水毁损或可能毁损他方财产，他方要求致害人停止侵害、消除危险、恢复原状、赔偿损失的，人民法院应当予以支持。
四、开挖土地相邻一方在自己的土地上挖水沟、水池、地窖、水井和地基时，应注意他方房屋、地基以及其他建筑物的安全。如果因此而影响他方建筑物的安全和正常使用的，人民法院应当分别情况，责令其消除危险、恢复原状或者赔偿损失。
五、种植林木相邻一方在自己的土地上种植林木的，应当注意不影响他方土地或者建筑物的正常使用。
　　如果一方种植的林木根枝伸延，危及另一方土地或建筑物的安全和正常使用的，应当责令林木种植人消除危险、恢复原状或者赔偿损失。
　　处理纠纷，如当事人达不成协议时，可提起诉讼。
六、房屋滴水相邻一方建造房屋应尽量避免房檐滴水对他方造成的损害。
　　因相邻房屋滴水而发生的纠纷，人民法院对有过错一方造成损害的，应当责令过错方排除妨碍或者赔偿损失。
七、采光与通风相邻各方建造房屋或其他建筑物，必须与邻居保持适当距离，不得妨碍邻居的通风和采光。
　　相邻一方违反有关规定修建建筑物，影响他方通风采光的，受害人有权要求停止侵害、恢复原状或赔偿损失。

|!法律效果|
行事相邻权的效果是一方要求另一方给予必要的便利，而另一方因此权利受到限制。
如果违反相邻关系，受害人对加害人享有物权请求权。

|!法律解释|
　　相邻关系的主体享有相邻权，但相邻权的的性质是什么？学界观点不一。有人认为相邻权属于不动产物权，它是用益物权的一种，是依法律规定直接发生的；有人认为相邻权不是一种独立的物权，而是所有权的内容；有人认为，相邻权不是一种独立的物权，而仍然属于所有权的范畴；还有人认为，相邻权不是一种独立的物权，只是所有权内容当然的扩张和限制；另外，有学者认为，相邻权应定义为法定地役权。但通说认为相邻权不是一种独立的物权，而是对所有权的一种限制，仍然属于所有权范畴。
　　相邻关系的特征相邻关系作为所有权的一种限制，有如下特征：
　　1.相邻关系的主体具有多数性和相邻性。相邻关系作为所有权的一种限制，只能发生在两个以上的民事主体之间，单一的民事主体不可能发生相邻关系问题。应注意者，相邻关系的主体不管是公民还是法人都必须是相邻不动产的所有人或使用人，对不动产享有合法权益。另一方面，相邻关系的主体必须具有相邻性，因为如果不动产不相毗邻，则所有人或者使用人之间不会发生权利行使的冲突问题，自然也就不发生相邻关系。此所谓“毗邻”，不仅包括不动产相互连接，也包括不动产相互邻近。
　　2.相邻关系的客体具有特殊性。尽管相邻关系属于所有权范畴，也是物权制度，但其客体与物权的客体是有区别的，在理论上有不同的看法，第一种观点认为，相邻关系的客体是不动产；第二种观点认为，相邻关系的客体是行使不动产权利时体现的利益；第三种观点认为，相邻关系的客体是相邻各方所实施的作为或不作为；第四种观点认为，相邻关系的客体是行使不动产权利时体现的利益，有时也可以是不动产本身。笔者认为，因不动产相邻关系属于不动产所有权范畴，其客体就是不动产，包括土地、房屋和其他建筑物。
　　3.相邻关系的内容具有复杂性。相邻关系的内容十分复杂，不同种类的相邻关系所包含的内容也是不同的。但总的来说，相邻各方应给对方所有权或使用权及其他权利的实现、行使提供必要的便利或限制自己的权利。

|!案例|
1998年胡某购买了南京瞻园路84号房屋，该房屋与南京秦淮区房产经营公司（下称经营公司）之间有一条南北向的巷道，其南端约14平方米的土地使用权属胡某家（产权政已注明）；巷道北侧的另一半土地使用权属于经营公司。数月后，经营公司在巷道南端胡家所属的墙体上安装了一扇门；1999年初，经营公司又在巷道北口砌了一道砖墙，将巷道口堵死；当年7月，又在巷道北段搭建玻璃钢瓦顶棚，用以堆放杂物。为防止杂物丢失，经营公司还在胡家房屋东墙的窗户前安装了防护网，将胡家窗户封死了。1999年8月，胡某将经营公司推上被告席，认为被告的行为严重影响了自家房屋的光照和通风，其行为侵犯了原告权利，要求被告停止侵害、排除妨碍、恢复原状。

|!比较|
相邻关系vs地役权
　　相邻关系制度的规范内容与地役权制度所要实现的规范目的，并无差异，即均以不动产利用的调节为其目的。另从制度的构成上看，相邻关系与地役权也有共同点，即它们皆以不动产权利的扩张或限制为其基本内容。
　　相邻关系与地役权，二者的差异如下：
　　1、相邻关系是不动产所有权内容的当然的扩张或限制，是由法律直接规定的；而地役权则是不动产所有人或利用人之间基于合同关系而对所有权的扩张或限制，是由当事人之间的地役权设定合同所规定的。
　　2、相邻关系不是一种独立的民事权利，不是一种独立的物权类型，它是所有权本身的限制或扩张；而地役权则为独立的民事权利，是物权（用益物权）的一种。
　　3、相邻关系作为一种物权法上的制度，是法律对邻近的不动产的利用作最低限度的调节的结果，它对不动产所有权的限制或扩张程度较小；而地役权作为当事人双方超越相邻关系的限度而约定的权利义务关系，其对土地所有权的限制或扩张的程度则较大。
　　4、地役权的取得既可以是有偿的，也可以是无偿的，而相邻关系中，当事人行使法律规定的权利时只要不给邻人造成损失，则通常是无偿的。
　　5、相邻关系的成立及对抗第三人，不需要登记便可当然发生，而地役权的成立，由物权的性质所决定，则以登记为必要。

地役权和相邻关系
——《物权法》的实施与配套法律法规完善(之四)
王利明　发布时间： 2007-08-25 10:00　光明日报

　　《物权法》在用益物权方面有一些制度创新,与原有或者现行规定不一样,体现在以下几个方面:

　　空间权制度的设置对有效利用

　　和保护土地资源有很重要意义

　　1、在建设用地使用权方面,首先第136条规定了空间权。依照第136条的规定,
建设用地使用权可以在土地的地表、地上和地下分别设立,这就是确定了空间权制度。空间权制度对有效利用和保护土地资源有很重要的意义。原来没有规定,但是实践中已经提出了很多这样的问题。这也涉及到了对136条怎样理解的问题。问题在于空间权是不是只能规定在建设用地使用权中,能不能单独设立?如在公园中修建地下停车场,是否非要将公园的地买下来才能修?单独利用地下空间行不行?公园的地是否属于建设用地、是否可以设立空间权还存在问题。即便能设立,能不能转让?这些问题都需要通过配套法律法规解决。再比如,户外广告的利用空间问题,其归属怎样界定,还没有完全解决。

　　2、严格限制建设用地土地使用权的划拨,规定在第137条。我理解这是强行性规定,若违反该规定订立建设用地使用权出让合同,合同无效,因为它直接损害国家利益。法院也在考虑对这个问题作出司法解释。

　　住宅用地使用权期限届满自动续期

强化了对公民房屋所有权的特别保护

　　3、第149条是一个重大的制度创新,规定了住宅建设用地使用权期限届满自动续期制度。这是为了强化对公民房屋所有权的保护而专门设置的特别规定。按照这一规定,首先应当区分住宅与非住宅建设用地,只有住宅用地才适用此规定。在建设用地使用权到期时,只有住宅用地才能自动续期延长。如果到期的不是住宅建设用地,而是商业或工业用地,就不能适用此规定。有人提出,综合开发、商住用地能否适用此规定?这就需要国务院法制办进行解释和解决。按照该规定,续期时房屋必须存在。第149条规定的本意在于确定“地随房走”的规则。尽管建设用地使用权有期限,但是只要房在,地就在。这也体现了房屋所有权的永久性,强化了对房屋所有权的保护。但反过来,如果房子不存在,“地权”就没有必要再延长了。

　　地役权是按合同利用他人不动产

　　以提高自己不动产效能的权利

　　4、《物权法》第十四章设立了地役权制度。地役权是按照合同约定利用他人不动产,以提高自己不动产效能的权利。从实践看,很多情况下, 不动产权利人都要利用别人的土地来实现自己的利益,比如在他人土地上建造设施。《物权法》在用益物权中规定了地役权,这实际上是规定了在出让、划拨、租赁等方式之外的一种利用土地的方式。这种方式适用范围究竟有多大,还需要配套的法律法规作进一步解释。

　　地役权和相邻关系经常发生混淆,怎样区分这两者,也是《物权法》起草中争议很大的问题。举两个例子:第一个例子是,一个楼层分上下两户,楼上住户经常从楼下经过。后来楼下用户把房子卖出去作为商店,买受人开店后就把楼梯封死,楼上住户无法从楼下通行,就想办法从旁边搭建楼梯,政府提出不能随便乱搭乱建,否则影响城市市容规划,于是楼上住户每天只能借助木梯上下通行,其母亲五年没有下楼,这是一个上访多年的案例。第二个例子是,一个公司建了高尔夫球场,后来又修了一个会所,从会所到球场的直线路线需要经过一个村子的土地。公司无权征收土地,而如果修一条专用道路,就要与农民达成协议,双方在协商过程中对价格发生了争议。

　　相邻关系是相邻一方在必要范围内

　　必须给另一方提供相应的便利

　　一般情况下,这两个例子里的前者属相邻关系,后者则属于地役权的问题。区别在于,就第一个例子来说,相邻关系是相邻的一方在必要范围内必须给另一方提供相应的便利,但过去民法中没有关于通行便利的规定,所以法院很难处理。而按照《物权法》的规定,楼下住户应该有义务向楼上住户提供通行的方便。为什么必须由法律规定?这实际上就是一种法律上的强制性干预,是相邻方的法定义务。通风、采光、通行等属于个人的基本生活需要,也可以说是保障个人正常生活的最基本条件,所以有人把它总结为个人的基本人权。有的国家把通风、采光、通行等权利作为人格权,比如日本,就是从这个角度考虑的——它是个人最基本的需要,所以法律必须强制性地要求一方给另一方提供这种便利,才能满足相邻方最基本、最低限度的生活需要。其次,这个问题为什么要由法律强制性地干预,而不能由双方通过合同来协商呢?这是因为涉及到最基本生活需要的问题,双方是无法通过谈判协商的,一方可能漫天要价以求对基本生活需要进行补偿,另一方在其基本需要不能满足时则可能会采取激烈的措施,这就会引发社会严重的冲突矛盾,所以法律要尽量避免这种冲突矛盾,就要直接干预,强制一方提供这种便利,而且不能要求对价,这是法律强制性的要求。第三,从效益角度考虑,也只有提供便利才符合“物尽其用”的要求,尽管通行会给一方造成妨碍,但和另一方对其物的有效利用相比,这种妨碍是比较小的。

　　第二种情况为什么要称其为地役权呢?地役权不是由法律强制规定的,而是由双方通过合同谈判解决的。为什么必须这样呢?就是因为这不是一个最基本生活需要的问题,因为不是说你无路可走、无法通行。假设出现了民法上所说的袋地,也就是说房屋四周全被人家的土地包围,无路可走了,这时就属于相邻关系,周围的邻居必须让人家走路。但是第二个例子里的情况并不是无路可走,是为了走近路;不是为了满足基本生活需要,而是为了满足经营需要。该公司追求的是一种商业利益,这是法律不能强行干预的,只能由双方通过谈判解决。这就是地役权的范畴,能征到地就征地,征不到地就通过达成协议来设定地役权。其次,用人家的地通行可能会给他人造成重大损失,法律很难确定补偿的问题,但是损失必须得到补偿,因此只能由双方协商,通过地役权的方式解决。

　　“公共地役权”是介于地役权

　　和相邻关系之间的一种权利

　　当然,现在有一个复杂的问题,就是公共服务公司提出来的:铺设管线等是为了公共利益的需要,但是没必要征地,而是要经过农村土地。如果通过设立地役权的方式,谈判成本过高,可否为了公共利益而适用相邻关系?有些国家将此视为特例,称之为“公共地役权”,就是介于地役权和相邻关系之间的一种权利,规定土地权利人必须提供便利,但是补偿的问题由双方谈判。我国目前没有这个制度,将来需要考虑制定配套的法律法规。

　　总的来说,《物权法》已经在很多方面改变了《土地管理法》和《城市房地产管理法》的规定,这就涉及《物权法》第8条“其他相关法律对物权另有特别规定的,依照其规定”的理解问题。关于这个规定产生了一些误解,很多人认为,第8条的意思是说凡是其他法律有特别规定,与《物权法》规定不一致的,只能依据其他法律规定。我谈一下自己的理解。第8条的规定有一个前提,就是其他法律和《物权法》的规定没有冲突,或者说《物权法》没有明显地修改这些规定。如果存在冲突,或者《物权法》已经明显修改了这些规定,那就不能依据这些特别法,只能根据“新法优于旧法”的规则适用《物权法》。第8条的意思实际上是“特别法优于普通法”,也就是说《物权法》是基本法,如果有特别规定,就适用特别规定。比如说关于承包经营权,《土地承包经营法》中有很多特别规定,这时才适用《土地承包经营法》。所以第8条确立的规则实际上是“特别法优于普通法”,但是如果存在冲突,还是应当适用“新法优于旧法”的规则。我个人认为,《土地管理法》和《城市房地产管理法》中的一些规定已经被修改的,就应该适用《物权法》中修改后的规定,而不应再适用《土地管理法》和《城市房地产管理法》的规定。(标题为编者所加)

|!其他|
　　相邻关系的调整原则根据我国《民法通则》的规定，调整相邻关系时应采取以下的原则：
　　第一、有利生产、方便生活。
　　第二、团结互助、公平合理。

　　王利明《物权法研究》之“相邻关系”
　　1，@@相邻关系在本质上是权利的限制或延伸的问题，相邻权不是独立的物权，不能产生独立的物权请求权。 注意是独立的物权请求权，在相邻纠纷中，受害者可以提起物权请求权。@@
　　2，相邻通行关系包括袋地和通行困难的准袋地，其他如进入土地取物。因建造、修缮建筑物以及铺设管线所形成的相邻关系，相邻另一方应当提供必要的便利，如允许专业检修人员进入屋内。
　　3，在司法实践上，因通风、采光引起的相邻纠纷较多。作者认为，第一，如果违反规划影响相邻的通风、采光的，另一方有权请求拆除。没有违反规划的，只能请求损害赔偿。第二，如果符合建筑采光设计标准规定而建造房屋，但客观上还是妨害了他人的通风、采光或日照的，也应当认定侵犯相邻关系。原因在于权利不能因规划错误而丧失。
　　由于通风、采光不是与生俱来，也可以处分，所以作者认为不属于人格权。
　　4，作者认为，眺望不属于相邻关系的范畴，因为这不是基本的生活需要，而是较高层次的享受。我也认为这属于地役权范畴。作者同时指出，如果第三人违反规划要求，盖新大楼或者设置公告牌，遮挡买受人的视线的，业主有权基于侵权责任请求排除妨害、赔偿损失。
　　5，不可量物侵害（第90条）只能发生在相邻的不动产权利人之间，才受民法相邻关系调整。如果相距较远，则按环境侵权来处理。不可量物侵害中确定受害人的损害有一个规则即“危险引受”规则，就是不可量物侵害地利用在先，受侵害地利用在后，受侵害者明知会发生不可量物的侵害而仍住入其附近建筑住宅，因受妨害而要求损害赔偿时，一般不予认可。
　　6，在相邻关系中，习惯的适用更为重要。因为习惯根植于当地的生产生活，可以较好地调整不动产的相邻关系，填补法律的空白。
　　7，现代民法理论大多认为，相邻只是近邻，甚至不邻接也可以发生相邻关系，如水流；相邻关系虽然是依法产生，无需对价，在特殊的情况下，如果因为行使相邻权给另一方造成损害的，也应当给予适当补偿；虽然相邻关系是法定的，但不能完全排斥当事人的约定。违法约定，也要承担违约责任。</pre>
</div>
<div title="知识管理" modifier="Steve" created="200911071604" modified="200911071605" tags="知识管理" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911071605">
<pre>在这个知识爆炸的年代，往往会产生信息过载。信息过载的一个原因就是没有经过良好的[[知识管理]]。</pre>
</div>
<div title="第一枚" modifier="Steve" created="200911100343" modified="200911100639" tags="软件 十枚" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100639">
<pre>[[Total Commander]]

长得丑是真的，我用了好几年，按道理应该习惯了吧，但丑媳妇总还是丑，只不过贤惠罢了。

Total Commander的特点是强大便捷，当然伴随而来的是难以上手，所以网上有很多人孜孜不倦地在传授心得体会。我也是被[[一哥们儿|http://xbeta.info/]]给忽悠了才用的，后来发现还真好用，再后来发现这哥们儿原来是师兄，在他的倡导下，很有去买个正版的冲动……只是最近手头紧，作者又是外国人……

不过我推荐大家用，完全不带教的。大多数人，用到Total Commander1%的功能就够了，已经足以替代Explorer了。而这样简单的应用是零成本上手的，前提是你用的是我的版本。

针对普通用户的最简易功能：多文件夹标签、多色彩差别显示，拼音首字母快速匹配、F3快速预览word、txt、jpg等、F12复制文件路径。

这样就够了。</pre>
</div>
<div title="第三枚" modifier="Steve" created="200911100430" tags="软件 十枚" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100430">
<pre>CLCL

首先，这是一个小日本写的，说实话，这点不太好。多么好的以软件啊，却毁在小日本手里。

功能的话，简单说就是剪切板加强。可以保存剪切板历史，常用的还可以保存模板。

像我就会保存10个记录，总是会用到，不用再回去找；复制多条文本的时候，也不用复制一个拷贝一个。很多人在网上拷贝了富文本之后会去notepad里面中转去除格式，有了这个之后也不必了。保存功能很强大，文本的话直接取第一行作为文件名，保存问txt，方便我网上摘录到Palm上去看。

最后，快捷呼出alt+c</pre>
</div>
<div title="第二枚" modifier="Steve" created="200911100424" tags="软件 十枚" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100424">
<pre>Everything

在考虑第二第三的时候，颇花费一点脑筋。到底哪个对大家来说更常用。

最后选定Everything是因为觉得大部分人东西乱放，经常找不到文件在哪里，因此很需要搜索。

所以，Everything是一款非常小巧快速的即时搜索工具，所谓即时就是新建的文件的同时出搜索结果。当然你不能过分的要求搜索全文，只能搜文件名，搜全文可以用[[Total Commander]]。另外要求是NTFS，反正现在大部分人都是NTFS吧。

我总是把Everything放在U盘里，去插别人的电脑的时候，顺便看一下他们有没有干坏事。</pre>
</div>
<div title="第四枚" modifier="Steve" created="200911100435" tags="软件 十枚" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100435">
<pre>Process Explorer

替代Windows的任务管理器。这也是Windows旗下的公司出品。

比Windows任务管理器强大的地方在于开机启动，常驻托盘，二维显示，树状目录。

可以清楚看到CPU使用情况，便于排查害群之马。</pre>
</div>
<div title="纸笔" modifier="Steve" created="200911100322" tags="GTD GTD工具" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100322">
<pre>纸笔的好处在于自由，形式上的自由，任何纸笔都可以，擦过屁股的也可以；载体上的自由，不存在没电或没信号这样的困扰；内容上的自由，想写什么想画什么都没问题，不用关心格式问题。

缺点在于不方便同步编辑共享。

顺便说一句，纸笔也是非常好的思维导图工具。</pre>
</div>
<div title="编辑格式" modifier="Steve" created="200912031639" tags="建站" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" changecount="1">
<pre>至于怎么编写Tiddler，你觉得我会讲解这么没技术含量，而且在我上面介绍的TiddlyWiki教学/简介页面都可以看到的内容吗？好吧好吧，我就说这么几句。把下面这个复制进一个Tiddler，你会看到效果，立马明白。

    ''粗体字''  --删除线--  __下划线__  //斜体字//  ^^上标^^  ~~下标~~ @@color(red):文字颜色@@  @@bgcolor(yellow):文字底色@@
    [[NewTiddler]]  [[显示文字|实际Tiddler]]  ~ThisIsNotATiddler
    [[超链接]]  [[显示文字|实际链接]]  [img[显示文字|图像路径]] [img[图像路径][超链接]]
    /% 注释 %/ 

为什么需要 ~ ？因为TiddlyWiki会自动把一个没有空格并且有两个大写字母的英文字串当成是一个Tiddler的名字，如果此Tiddler还不存在，会以斜体的形式显示。加上~，TW就不这么做了。

结构化显示一般需要用到!、*、#、&gt;、{{{}}}和|
!这是第一级
!!这是第二级
!!!这是第三级
*这是第一个圆点
**这是第二个圆点
***这是第三个圆点
#这是第一节
##这是第一小节
###这是第一小小节
&gt;这是引文
&gt;&gt;这是引文里的引文
&gt;&gt;&gt;这是引文里的引文里的引文
{{{这里的 [[Tiddler]] 不会变成链接}}}
| A1 | A2 | A3 |
| B1 | B2 | B3 |
| C1 | C2 | C3 |
表格
|&gt;|产品价格表|
|!产品|!价格|
|手机|硬解900|
|~|软解1000|</pre>
</div>
<div title="表见代理" modifier="Steve" created="200911101415" modified="200911161327" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911161327">
<pre>|!定义|
表见代理是指行为人虽无代理权，但由于本人的行为，造成了足以使善意第三人相信其有代理权的表象，而与善意第三人进行的、由本人承担法律后果的代理行为。
|!法条|
[[民法通则]]
第六十六条
@@没有代理权、超越代理权或者代理权终止后的行为，只有经过被代理人的追认，被代理人才承担民事责任。@@未经追认的行为，由行为人承担民事责任。本人知道他人以本人名义实施民事行为而不作否认表示的，视为同意。
代理人不履行职责而给被代理人造成损害的，应当承担民事责任。
代理人和第三人串通，损害被代理人的利益的，由代理人和第三人负连带责任。
第三人知道行为人没有代理权、超越代理权或者代理权已终止还与行为人实施民事行为给他人造成损害的，由第三人和行为人负连带责任。

[[合同法]]
第四十八条
@@行为人没有代理权、超越代理权或者代理权终止后以被代理人名义订立的合同，未经被代理人追认，对被代理人不发生效力，由行为人承担责任。@@
相对人可以催告被代理人在一个月内予以追认。被代理人未作表示的，视为拒绝追认。合同被追认之前，善意相对人有撤销的权利。撤销应当以通知的方式作出。

第四十九条
行为人没有代理权、超越代理权或者代理权终止后以被代理人名义订立合同，相对人有理由相信行为人有代理权的，该代理行为有效。

|!构成要件|
#行为人超越代理权或代理权已经终止。超越代理权包括质的超越和量的超越。
#以本人的名义。
#须为[[法律行为]]。
#相对人善意。相对人不知道也不可能知道行为人没有[[代理权]]。
#相对人无[[过失]]。已尽到应由的[[注意义务]]。

|!法律解释|

|!法律效果|
　　1.表见代理成立，订立的合同有效，表见代理中的相对人不享有《合同法》第48条规定的撤销权。《中华人民共和国合同法》第48条第1款规定：行为人没有代理权、超越代理权、或者代理权终止后以被代理人名义订立合同，未经被代理人追认，对被代理人不发生法律效力，由行为人承担民事责任。第2款规定：相对人可以催告代理人在一个月内予以追认。合同被追认之前，善意相对人有撤销的权利。撤销应以通知对方的方式作出。本条所指的无权代理应当是狭义的无权代理，在此情况下，相对人有撤销权。而《合同法》第49条规定表见代理的情况虽然也是无权代理，但是这种情况属于广义的无权代理，与第48条的规定中的狭义的无权代理不同，其根本区别是：是否存在有使相对人有理由相信本无代理权的行为人有代理权的客观事实。表见代理虽属无权代理，但是，只要存在相对人有理由相信行为人有代理权的事实，表见代理成立，行为人的代理行为就应当按有效的代理来看待；在此情况下，所签订的合同就应当是有效合同。所以，相对人不享有《合同法》第48条规定的撤销权。
　　2. 本人（被代理人）对相对人（善意第三人）承担民事责任。表见代理被认定成立后，其在法律上产生的后果同有权代理的法律后果一样，即由被代理人对代理人实施的代理行为承担民事责任。
　　3.代理人对本人（被代理人）承担民事赔偿责任。被代理人因表见代理成立而承担民事责任，因此给被代理人造成损失的，被代理人有权根据是否与代理人有委托关系、代理人是否超越代理权以及代理权是否已经终止等不同的情况，以及无权代理人的过错情况，依法请求无权代理人给予相应的赔偿。无权代理人应当赔偿给被代理人造成的损失。
　　4.无权代理人对被代理人的费用返还请求权。表见代理的法律后果使被代理人的利益受到损害时，无权代理人应依法赔偿。同时，并非所有的表见代理的法律后果都必然对被代理人不利，当表见代理的法律后果是使被代理人从中受益时，根据公平原则，权利义务应当对等，无权代理人有权要求被代理人支付因实施代理行为而支出的相关的合理费用。

|!例外|

|!案例|
|case1|
表见代理的认定和无权代理人之法律责任
作者： 李传松    发布时间： 2004-12-14 12:10:38
    一、问题的提出

    民商事纠纷疑似犯罪或涉及犯罪案件，这是当前民商事审判中的一个难点，在罪与非罪之间，往往颇费踌躇。在无权代理人的行为构成犯罪的情况下，表见代理的认定和无权代理人法律责任的承担即是其中一个颇为复杂的问题。以下试举一例加以分析。

    徐某与家天下房地产经纪有限公司签订合作协议，约定徐某挂靠家天下公司成立第一分公司，从事房产中介业务，合作期限３个月。合作期间，徐某私刻了家天下公司的业务专用章和现金收讫章。合作期限届满后，徐某仍以家天下公司名义继续从事经营。２００３年１月８日，徐某以家天下公司名义与房主蔡某签订了某处房产销售委托代理协议，同年１月１８日，徐某又以家天下公司名义与华某签订了代办购房协议，约定华某以１９万元的价格购买蔡某房屋产权，徐某在两份协议中都加盖了由其私刻的家天下公司业务专用章。协议签订后华某向徐某交纳定金１．５万元、首付款５．５万元，徐某出具了盖有其私刻的家天下公司现金收讫章的收款收据。徐某将上述款项部分用于个人还债，其余挥霍一空。徐某案发后被法院以合同诈骗罪定罪判刑，华某遂以徐某行为构成表见代理为由，向法院提起民事诉讼，要求家天下公司承担违约责任。家天下公司认为徐某的行为构成合同诈骗罪，而不是表见代理，华某所遭受的损失应由徐某承担。

    本案的特别之处在于，在华某向家天下公司提起民事诉讼前，无权代理人徐某已经因合同诈骗罪被定罪判刑。有人提出，由于徐某的行为已构成犯罪，故不必从表见代理构成要件出发考虑其行为是否构成表见代理，法院应以徐某行为已构成犯罪从而不可能再同时构成表见代理为由，直接裁定驳回华某对家天下公司的起诉，华某作为徐某犯罪行为的受害人，可向徐某提起附带民事诉讼。就处理本案而言，该思路无疑是可行的，但也由此引申出一个值得探讨的问题，即：在无权代理人的行为构成犯罪的情况下，由其与相对人实施的行为是否不可能再构成表见代理，反言之，在造成本人权益受到损害的表见代理中，由本人向善意相对人承担民事责任后，无权代理人应当承担何种法律责任，是否必然排斥刑事责任。

    二、表见代理的认定

    表见代理，是指本属于无权代理，但因本人（被代理人）与无权代理人之间的关系具有授予代理权的表象，足以使相对人相信无权代理人有代理权，相对人基于此项信赖与无权代理人进行交易，由此产生的法律效果由法律强制本人承担。

    本案中，徐某通过合同约定，挂靠家天下公司成立分公司从事经营活动，但在与华某订约时挂靠合作协议已届期满，属于曾经具有代理权但已经终止而无代理权的情形。相对人华某与徐某订立代办购房协议前，在徐某经营场所核对了公司名称，见到了营业执照复印件和业务专用章，此前徐某也确实以家天下分公司名义经营近半年，这些情况应当成为华某相信徐某具有家天下公司代理权的正当理由。但是，事实上，徐某交华某查看的营业执照复印件和业务专用章均未经家天下公司许可，系徐某擅自复印留存和私刻伪造，华某与徐某签订代办购房协议固然是其真实意思表示，但依一般人之注意义务，在交易时查看对方营业执照原件为常识，营业执照包括正本和副本亦为一般人所知悉。华某发现徐某提供的营业执照是复印件，也曾表示怀疑，但在看到徐某提供的业务专用章后即打消了顾虑，应属疏于注意，在未能识破徐某不具有代理权方面存在过失。因此，徐某的行为不完全具备表见代理的构成要件，不能构成表见代理，而属于狭义无权代理，根据我国合同法第四十八条的规定，在被代理人不予追认的情况下，对家天下公司不发生法律效力，应由行为人徐某承担责任。

    三、无权代理人的法律责任

    一般认为，在害及本人利益的表见代理中，由于无权代理人擅自以本人的名义为民事行为，造成本人损害，如果善意相对人未撤销其行为，而主张表见代理的，本人在承担表见代理的法律效果后，获得向无权代理人追偿的权利。这在民事责任中属于一般侵权责任，适用我国民法通则第一百一十七条的规定。如果对于本人的损失，无权代理人与本人都有过错，则按双方过错的性质和程度分担损失。

    但当前越来越多的表见代理案例表明，无权代理人借代理之名行侵占财物之实的情形屡见不鲜。在本人依表见代理向善意相对人为给付后，再按照侵权之债向无权代理人主张权利时，无权代理人往往已将以本人名义从善意相对人处取得的财物挥霍一空，从而没有偿还能力，本人因此蒙受损失。表见代理制度对本人不利的一面由此可见一斑。法律设立表见代理制度，虽多少于本人有所不利，但可以维护交易安全，也有利于代理制度的实行。对于表见代理制度，我们在司法实践中，应结合其他法律制度加以完善，尽可能趋利避害，最大限度地实现公平正义。在构成表见代理的无权代理行为中，无权代理人恶意借代理之名行侵占财物之实，如果善意相对人坚持主张按表见代理处理，本人承担民事责任后，对于无权代理人，其行为符合我国刑法第二百七十条关于侵占罪的构成要件的，本人作为受害人，可以根据我国刑事诉讼法第一百七十条的规定，以侵占罪向法院提起刑事自诉，并可提起附带民事诉讼。

    侵占罪是指将代为保管的他人财物非法占为己有，数额较大，拒不退还的行为。无权代理人恶意借代理之名行侵占财物之实的行为完全符合侵占罪的构成要件。首先，从主体要件看，侵占罪属于身份犯，其犯罪主体必须是他人财物的代为保管者或占有者。表见代理中无权代理人以本人名义向相对人为意思表示，或者受领相对人的意思表示，为本人实施民事行为，其效力直接及于本人。如果无权代理人依表见代理行为从相对人处获取财物，无权代理人对该财物不是所有者而是代为保管者或暂时占有者，符合侵占罪主体要件。其次，从客观要件看，侵占罪在客观方面表现为将代为保管的他人财物非法占为己有，数额较大，拒不退还的行为。这里的“他人”不限于公民个人。代为保管的原因包括代理等民事行为所导致的对他人财物的合法持有。无权代理人不按法律关于代理行为的规定将代为保管的数额较大的财物交与本人，而非法占为己有，符合本罪的客观要件。第三，从主观要件看，表现为故意，即明知是代为保管的他人财物而非法占为己有。无权代理人恶意借代理之名行侵占财物之实，主观方面表现为非法占有他人财物的故意，符合本罪主观要件。此外，由于侵占罪适用告诉的才处理，故将无权代理人恶意借代理之名行侵占财物之实的行为作为侵占罪处理，亦不违反刑法谦抑性的精神，诉讼是否启动取决于本人的意愿，这对衡平表见代理中本人的利益也是公平的。

    假设本案相对人华某在与无权代理人徐某交易前，尽了一般交易人的注意义务，查看的是营业执照副本原件，徐某的行为构成表见代理，那么在华某向家天下公司提起民事诉讼时，家天下公司应作为表见代理中的本人承担表见代理行为的法律效果。因为本案中，徐某与华某及蔡某之间分别存在合同关系，而与家天下公司的合作协议已经届满，如果认定徐某的行为构成合同诈骗罪，犯罪行为的受害人只能是华某或蔡某，在假设华某作为善意相对人与无权代理人徐某的行为构成表见代理的情况下，该同一行为不可能再同时构成合同诈骗罪。

    如上所述，如果法院依本人所请，对无权代理人以侵占罪定罪量刑，同时又认定其无权代理行为构成表见代理，是否会自相矛盾。该疑问实际上是混淆了无权代理人与本人及善意相对人三者之间的关系、对无权代理人先后实施的@@两个行为（先表见代理，后侵占）@@未作区分所致。无权代理人以代理为名行侵占之实的行为，实际上是把表见代理情形下应当归属本人的、由无权代理人以本人名义从善意相对人处获得的财物据为己有，拒不交与本人，该行为由无权代理人实施，侵害对象是应属本人的合法财物，行为的受害人为本人，且该行为发生在表见代理之后，与表见代理行为并非同一行为，既为两个行为，分属两种不同性质，便不足为怪。所以，在无权代理人的行为构成表见代理的情况下，同时认定无权代理人侵占本人财物的行为构成犯罪，并不矛盾。

    而在本案中，由于徐某的行为本不构成表见代理，事后又未获得家天下公司的追认，华某的损失自应由行为人徐某承担，与家天下公司无涉。在华某提起的民事诉讼中，法院最终驳回华某的起诉是正确的。

|case2|
　　构建表见代理制度的出发点在于维护交易安全、保护相对人的利益，换个角度讲也是对本人责任的加重。针对现实生活中交易秩序建立得不够完善，诚实信用没有形成市场行为准则的情况，不当地扩张表见代理的适用，过度保护相对人，有违背民法的公平原则和矫枉过正之嫌。 

案情 

　　2003年11月6日，张立强以北京远景公司（以下简称“北京远景”）的名义与北方传媒公司（以下简称“北方传媒”）签订广告合同一份，约定：北方传媒为北京远景发布“柯林龙安84除菌系列”广告，广告金额为573460元。该份合同上留有北京远景的电话、厂址等，但没有加盖公章。合同签订后，张立强通过现金形式支付部分广告费后，该广告即在辽宁1、2、3、4频道予以播放。后在北方传媒催促张立强支付剩余广告款时，张立强用写有“北京远景“字样的公文用纸出具“广告费延付说明”一份，并加盖北京远景公章，确认该公司未能及时支付广告代理费305811元，并要求延期付款。北方传媒在多次催要未果后，诉讼至法院，要求北京远景支付广告费。北京远景以张立强非本公司职员、无授权委托关系、该产品虽系该公司生产，但该公司不负责销售，销售商为张立强所在单位等抗辩理由，认为应由张立强个人承担责任，并提供一份由张立强所在单位出具给北京远景的授权委托书，证明张立强的身份及其所在单位委托北京远景生产该广告产品的事实。本案在审理中，北京远景向法院提出鉴定申请，要求对北方传媒提交的“广告费延付说明”上的印鉴真实性进行鉴定。经公安部鉴定后结论为：印章与工商局预留样本印文不同。 

裁判 

　　一审法院依照合同法第四十九条、第一百零七条规定判决：北京远景一次性给付北方传媒广告费305811元。宣判后，北京远景不服，提出上诉，辽宁省沈阳市中级人民法院作出撤销一审判决，驳回北方传媒诉讼请求的终审判决。 

评析 

　　本案争议的焦点为张立强的行为是否构成表见代理，双方当事人之间是否建立广告合同关系。 

　　表见代理，属于广义的无权代理范畴，因本人与无权代理人之间的关系具有外表授权的特征，致使相对人有理由相信行为人有代理权而与其进行民事法律行为，从而使之发生与有权代理相同的法律效果。由于合同法第四十九条对表见代理的规定过于原则和抽象，导致法律适用的不确定性，尤其是“有理由”一词为立法解释和司法解释留下了很大的空间。对于如何界定“有理由”的范围和尺度，是司法实践中的难题，也是本案的关键问题。判断是否构成表见代理，应从以下几个方面考察： 

　　1.必须符合信赖要件。即有客观的权利外观，并能够使相对人根据客观事实在主观上形成该代理人不容怀疑的具有代理权的认识。它是构成表见代理的基础，也是相对人利益得以保护的前提。所谓权利外观即具有授权行为的外表或假象，使相对人相信无权代理人已经获得授权。授权表象理论产生于禁止翻供规则，即法律不允许当事人否认别的有理智的人从他的言行中得出的合理结论。结合司法实践中的经验，一般认为表见代理的表现形式大致分为有授权表象的表见代理、有未越权表象的表见代理、有代理权延续表象的表见代理，具体包括：行为人持有某种能证明代理权的文件，如本人的介绍信、盖有合同专用章或公章的空白合同书；被代理人以某种意思表示，声明授予行为人代理权，而事实上并未授权；知道他人以本人名义实施代理行为而不作否认表示、对代理权进行特别限制而未告知相对人；无权代理人与本人存在某种特殊身份关系，如夫妻关系、父母子女关系；代理人权限终止后，被代理人未尽通知、公告义务。总之该“合理理由”的判断是依任何一个正常交易的人能根据表象自然推断出代理人具有代理权为标准。正是基于这种客观的事实而产生的信赖才能称为合理信赖，如果没有形成客观的权利外观，完全凭借主观判断得出无权代理人有代理权的结论，即是误信，不能产生表见代理的法律效果。 

　　2.要符合本人与无权代理人之间存在一定关联性的要件，代理本身是私法自治扩张的产物，是从制度上对被代理人因代理人的行为而承担责任的扩张与补充。表见代理制度本身，加重了被代理人的责任，如无限制扩张，会造成人人无安全感，使法律丧失安全性和可预测性，使被代理人在无法控制、无法预料的情况下，为无权代理人的过错承担责任。同时从被代理人的责任基础看，任何一种归责原则都不可能脱离人的行为而存在，即无行为就无责任。表见代理这种关联性除存在特殊身份关系外，通常是以本人的行为而产生授权假象，因此在本人与无权代理人没有任何牵连的情形，不应适用表见代理。另外，本人的行为虽然往往是一种过失行为，但其责任不限于过失责任，即表见代理的成立不以本人主观上存在过失为必要条件，即使本人没有过失，只要客观上存在使相对人相信行为人有代理权的事实，仍构成表见代理。也就是说本人的作为、不作为行为只要为信赖表象提供原因即可。 

　　3.相对人须符合善意、无过失的要件。即相对人不知道或不应当知道无权代理人实际上没有代理权，且这种不知并非因疏忽或缺乏应有的谨慎而造成。这种过失既包括相对人未尽到审查和进一步核实义务，也包括不应当产生合理的信赖而主观上陷入一种错误的认识和判断。相对人应负有以下注意义务：第一、审查义务。相对人在与自称是代理人的人进行法律行为时，应要求对方出示代理证书、介绍信、身份证明等，以了解和证实其身份、代理权限。第二、判断义务。在进行表面审查的同时，对其中缺陷应具有必要的警觉，对代理人的行为是否与职位一致，是否有不相适应的言行等进行合理判断。第三、核实义务。对于通过谨慎判断，认为可能存在瑕疵，应进一步进行核实。 

　　本案中由于“延付说明书”中的公章已被鉴定为不是北京远景的公章。对于张立强所持有北京远景的名片，留有北京远景的电话、地址，使用北京远景的公文用纸等均不能形成授权表象，因此也无法产生合理的信赖，只能说北方传媒对张立强的个人行为产生了错误判断。虽然北京远景是广告产品的制造者，也有可能因广告效应获得经济利益，这只能说与合同的标的有一定关联，不能由此推断与无权代理人之间存在牵连。而且，北方传媒在与张立强缔约过程中，未要求对方出具任何证明文件，也没有要求在合同上加盖北京远景的公章，对张立强所留电话号码是否是北京远景的办公电话未进行核实，仅通过名片、公文用纸、北京远景为广告产品的制造者等就主观臆断认为张立强为北京远景的业务员，这种基于非正当信赖产生的判断，明显存在主观过错。综上，本案不构成表见代理，北京远景不承担民事责任。</pre>
</div>
<div title="要素" modifier="Steve" created="200911110342" modified="200911110808" tags="法学 民法" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911110808">
<pre>就某一民法上制度，采概念、法条、构成要件、法律效果、法律解释、案例（请求权基础+演绎）、比较、其他的论述方式。

就某一民法上权利，采概念、法条、构成要件、法律效果、法律解释、时效、举证责任、案例的论述方式。</pre>
</div>
<div title="软件" modifier="Steve" created="200911080546" modified="200911080731" tags="软件 首页" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911080731">
<pre>&lt;html&gt;
&lt;br&gt;
&lt;DIV&gt;&lt;FONT face=微软雅黑&gt;&lt;FONT size=6&gt;&lt;STRONG&gt;软件使用心得。&lt;FONT face=微软雅黑&gt;
&lt;/html&gt;
</pre>
</div>
<div title="软件推荐" modifier="Steve" created="200911100334" tags="软件" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911100334">
<pre>之后会有一个特辑，全是常用必备软件，有电脑的人都用得到，总共[[十枚]]。

你要做的就是放下姿态，排除抵触情绪，本着不耻下问的心情，完全相信我。</pre>
</div>
<div title="阅读" modifier="Steve" created="200911080603" modified="200911080603" tags="阅读 首页" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911080603">
<pre>&lt;html&gt;
&lt;br&gt;
&lt;DIV&gt;&lt;FONT face=微软雅黑&gt;&lt;FONT size=6&gt;&lt;STRONG&gt;阅读笔记。&lt;FONT face=微软雅黑&gt;
&lt;/html&gt;
</pre>
</div>
<div title="高鸿钧老师谈清华考研法理摘要" modifier="Steve" created="200911131444" modified="200911131445" tags="法学 法理" server.type="file" server.host="https://dl.dropbox.com/u/762096/MyWiki.html" server.page.revision="200911131445">
<pre>　　比如04年法理学试题简述题：法律责任的后果？回答这样的问题时注意不要从部门法回答，要从宏观的角度回答，重要的是把道理讲出来。再如论述题：结合部门法举例阐释法的道德性（法律与道德），回答这类问题时，要注意与部门法的结合，这是今年出题的思路与趋势，最好能举出具体制度，与实际联姻，这样论述更具说服力，会较容易取得高分的。
　　答题注意事项：
　　回答简述题只需要答出要点即可，不要过分展开论述题要尽可能根据题目要求展开。例如回答“分权制衡”，先用一两句过渡句，谈谈要论述什么问题，这样不会显得太突兀；然后分点分层次回答，注意各要点之间的内在逻辑性：⑴什么是分权制衡；⑵怎么制衡，如何分类；⑶为什么要分权制衡；⑷最好再能结合中国现实情况谈一谈，但是切忌不要答政治套话。
　　关键是要做到以下几点：
　　第一，要找准角度，去年900多人报考清华，四分之三法理不及格，原因就在于没有找准回答问题的立脚点。至于如何找准立脚点，要注意揣摩老师出题的思路，靠平时学术积累，训练思维的敏感度。这一点要关注清华几位法理老师，比如高鸿钧老师、许章润老师、王晨光老师、高其才老师、江山老师的学术论文，注意他们分析问题的思路，作答时使用的语言如果比较与几位老师比较对路，让他们感到兴奋点，就比较容易在法理上得高分了。不过，类似“法律是一种生活方式”这样的问题不会再出现了。
　　第二，要做到问啥答啥，注意千万不要答多，题目没有问的不要答，法理考试不同于政治考试，答的内容超出题目所问的范围，阅卷老师会视为你不清楚不明白如何回答。因此多答是完全有可能扣分的。例如04年法理案例题，关于婚检取消，只需要回答法的自由即可。
　　第三，使用语言要尽量规范，使用关键词，注意踩点得分，老师看到考试试卷中有想要得到的词汇出现，就有可能给分了，因为几位阅卷老师是在很短的时间内完成上千份试卷的阅卷工作的，所以可想而知，满篇不见老师想要考试回答的词汇，即使意思类似，也很得高分的。
　　最后，回答试卷的行文中，要注意标点符号的使用，这样可以增加印象分的。
　　有同学问到“恶法非法”与“恶法亦法”的问题，注意什么才属恶法的范畴呢，例如希特勒时期高度专制的法律，就是反人类的恶法。新的道路安全法中机动车司机负全责与沈阳撞死白撞事件，并非恶法的问题，而是利益与价值协调的问题。
　　高老师推荐《西方法理思想史》一书，对法理考取高分很有帮助的；此外那本法理红宝书张文显的《法理学》（第二版），对掌握基本知识是很有帮助的。
　　清华出题不会出偏题怪题，前些年一直是高鸿钧老师和许章润老师出题，今年不一定，但据我们清华内部分析，很可能还是高鸿钧参与出题，另外一个可能是高其才老师和王晨光老师中的一个。
　　高老师总结概括法理学有四大板块：
　　@@⑴法律本体论：包括法是什么、法的特征、法的规则、法的原则、法的要素（静态的法）；⑵法律运行论：包括立法、司法、执法、法治（动态的法）；⑶法律价值论：包括法的公平、正义、效率、自由、秩序、安全（恶与善的区分）；⑷法律关系论：法律与道德、宗教、政治、哲学的关系。@@
     清华法理出题基本会平均涉及以上四个大的方面。</pre>
</div>
<div title="黄色水果刀" modifier="Steve" created="200912031555" tags="传记" server.type="file" server.host="dl.dropbox.com/u/762096/Steve.html" changecount="1">
<pre>同宿舍的云南小孩有一把黄色水果刀，我时常借来，或者拿来削，时而拿来砍，更多时候只是用来挥舞。水果刀砍起来一点都不够狠，我在耍刀的时候，大家都说我像云南小孩。于是收起刀子接着削我的水果，久而久之，水果刀上是各种各样水果的味道，舔一下，味道相当不错。后来看时尚杂志，建议男士使用军刀削水果，会比较有风度。隧放弃水果刀。后忽然明白，电影里的杀手，砍完人后，会拿来舔一舔。这说明，这把刀之前肯定也削过水果，加了鲜血之后，味道愈发鲜美。</pre>
</div>
</div>
<!--POST-STOREAREA-->
<!--POST-BODY-START-->
<!--POST-BODY-END-->
<script id="jsArea" type="text/javascript">
//<![CDATA[
//
// Please note:
//
// * This code is designed to be readable but for compactness it only includes brief comments. You can see fuller comments
//   in the project Subversion repository at http://svn.tiddlywiki.org/Trunk/core/
//
// * You should never need to modify this source code directly. TiddlyWiki is carefully designed to allow deep customisation
//   without changing the core code. Please consult the development group at http://groups.google.com/group/TiddlyWikiDev
//

//--
//-- Configuration repository
//--

// Miscellaneous options
var config = {
	numRssItems: 20, // Number of items in the RSS feed
	animDuration: 400, // Duration of UI animations in milliseconds
	cascadeFast: 20, // Speed for cascade animations (higher == slower)
	cascadeSlow: 60, // Speed for EasterEgg cascade animations
	cascadeDepth: 5, // Depth of cascade animation
	locale: "en" // W3C language tag
};

// Hashmap of alternative parsers for the wikifier
config.parsers = {};

// Adaptors
config.adaptors = {};
config.defaultAdaptor = null;

// Backstage tasks
config.tasks = {};

// Annotations
config.annotations = {};

// Custom fields to be automatically added to new tiddlers
config.defaultCustomFields = {};

// Messages
config.messages = {
	messageClose: {},
	dates: {},
	tiddlerPopup: {}
};

// Options that can be set in the options panel and/or cookies
config.options = {
	chkRegExpSearch: false,
	chkCaseSensitiveSearch: false,
	chkIncrementalSearch: true,
	chkAnimate: true,
	chkSaveBackups: true,
	chkAutoSave: false,
	chkGenerateAnRssFeed: false,
	chkSaveEmptyTemplate: false,
	chkOpenInNewWindow: true,
	chkToggleLinks: false,
	chkHttpReadOnly: true,
	chkForceMinorUpdate: false,
	chkConfirmDelete: true,
	chkInsertTabs: false,
	chkUsePreForStorage: true, // Whether to use <pre> format for storage
	chkDisplayInstrumentation: false,
	txtBackupFolder: "",
	txtEditorFocus: "text",
	txtMainTab: "tabTimeline",
	txtMoreTab: "moreTabAll",
	txtMaxEditRows: "30",
	txtFileSystemCharSet: "UTF-8",
	txtTheme: ""
	};
config.optionsDesc = {};

// Default tiddler templates
var DEFAULT_VIEW_TEMPLATE = 1;
var DEFAULT_EDIT_TEMPLATE = 2;
config.tiddlerTemplates = {
	1: "ViewTemplate",
	2: "EditTemplate"
};

// More messages (rather a legacy layout that should not really be like this)
config.views = {
	wikified: {
		tag: {}
	},
	editor: {
		tagChooser: {}
	}
};

// Backstage tasks
config.backstageTasks = ["save","sync","importTask","tweak","upgrade","plugins"];

// Extensions
config.extensions = {};

// Macros; each has a 'handler' member that is inserted later
config.macros = {
	today: {},
	version: {},
	search: {sizeTextbox: 15},
	tiddler: {},
	tag: {},
	tags: {},
	tagging: {},
	timeline: {},
	allTags: {},
	list: {
		all: {},
		missing: {},
		orphans: {},
		shadowed: {},
		touched: {},
		filter: {}
	},
	closeAll: {},
	permaview: {},
	saveChanges: {},
	slider: {},
	option: {},
	options: {},
	newTiddler: {},
	newJournal: {},
	tabs: {},
	gradient: {},
	message: {},
	view: {defaultView: "text"},
	edit: {},
	tagChooser: {},
	toolbar: {},
	plugins: {},
	refreshDisplay: {},
	importTiddlers: {},
	upgrade: {
		source: "http://www.tiddlywiki.com/upgrade/",
		backupExtension: "pre.core.upgrade"
	},
	sync: {},
	annotations: {}
};

// Commands supported by the toolbar macro
config.commands = {
	closeTiddler: {},
	closeOthers: {},
	editTiddler: {},
	saveTiddler: {hideReadOnly: true},
	cancelTiddler: {},
	deleteTiddler: {hideReadOnly: true},
	permalink: {},
	references: {type: "popup"},
	jump: {type: "popup"},
	syncing: {type: "popup"},
	fields: {type: "popup"}
};

// Browser detection... In a very few places, there's nothing else for it but to know what browser we're using.
config.userAgent = navigator.userAgent.toLowerCase();
config.browser = {
	isIE: config.userAgent.indexOf("msie") != -1 && config.userAgent.indexOf("opera") == -1,
	isGecko: config.userAgent.indexOf("gecko") != -1,
	ieVersion: /MSIE (\d.\d)/i.exec(config.userAgent), // config.browser.ieVersion[1], if it exists, will be the IE version string, eg "6.0"
	isSafari: config.userAgent.indexOf("applewebkit") != -1,
	isBadSafari: !((new RegExp("[\u0150\u0170]","g")).test("\u0150")),
	firefoxDate: /gecko\/(\d{8})/i.exec(config.userAgent), // config.browser.firefoxDate[1], if it exists, will be Firefox release date as "YYYYMMDD"
	isOpera: config.userAgent.indexOf("opera") != -1,
	isLinux: config.userAgent.indexOf("linux") != -1,
	isUnix: config.userAgent.indexOf("x11") != -1,
	isMac: config.userAgent.indexOf("mac") != -1,
	isWindows: config.userAgent.indexOf("win") != -1
};

// Basic regular expressions
config.textPrimitives = {
	upperLetter: "[A-Z\u00c0-\u00de\u0150\u0170]",
	lowerLetter: "[a-z0-9_\\-\u00df-\u00ff\u0151\u0171]",
	anyLetter:   "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]",
	anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]"
};
if(config.browser.isBadSafari) {
	config.textPrimitives = {
		upperLetter: "[A-Z\u00c0-\u00de]",
		lowerLetter: "[a-z0-9_\\-\u00df-\u00ff]",
		anyLetter:   "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff]",
		anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff]"
	};
}
config.textPrimitives.sliceSeparator = "::";
config.textPrimitives.sectionSeparator = "##";
config.textPrimitives.urlPattern = "(?:file|http|https|mailto|ftp|irc|news|data):[^\\s'\"]+(?:/|\\b)";
config.textPrimitives.unWikiLink = "~";
config.textPrimitives.wikiLink = "(?:(?:" + config.textPrimitives.upperLetter + "+" +
	config.textPrimitives.lowerLetter + "+" +
	config.textPrimitives.upperLetter +
	config.textPrimitives.anyLetter + "*)|(?:" +
	config.textPrimitives.upperLetter + "{2,}" +
	config.textPrimitives.lowerLetter + "+))";

config.textPrimitives.cssLookahead = "(?:(" + config.textPrimitives.anyLetter + "+)\\(([^\\)\\|\\n]+)(?:\\):))|(?:(" + config.textPrimitives.anyLetter + "+):([^;\\|\\n]+);)";
config.textPrimitives.cssLookaheadRegExp = new RegExp(config.textPrimitives.cssLookahead,"mg");

config.textPrimitives.brackettedLink = "\\[\\[([^\\]]+)\\]\\]";
config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\]";
config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
	config.textPrimitives.brackettedLink + ")|(?:" +
	config.textPrimitives.urlPattern + ")","mg");
config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
	config.textPrimitives.titledBrackettedLink + ")|(?:" +
	config.textPrimitives.brackettedLink + ")|(?:" +
	config.textPrimitives.urlPattern + ")","mg");

config.glyphs = {
	browsers: [
		function() {return config.browser.isIE;},
		function() {return true;}
	],
	currBrowser: null,
	codes: {
		downTriangle: ["\u25BC","\u25BE"],
		downArrow: ["\u2193","\u2193"],
		bentArrowLeft: ["\u2190","\u21A9"],
		bentArrowRight: ["\u2192","\u21AA"]
	}
};

//--
//-- Shadow tiddlers
//--

config.shadowTiddlers = {
	StyleSheet: "",
	MarkupPreHead: "",
	MarkupPostHead: "",
	MarkupPreBody: "",
	MarkupPostBody: "",
	TabTimeline: '<<timeline>>',
	TabAll: '<<list all>>',
	TabTags: '<<allTags excludeLists>>',
	TabMoreMissing: '<<list missing>>',
	TabMoreOrphans: '<<list orphans>>',
	TabMoreShadowed: '<<list shadowed>>',
	AdvancedOptions: '<<options>>',
	PluginManager: '<<plugins>>',
	ToolbarCommands: '|~ViewToolbar|closeTiddler closeOthers +editTiddler > fields syncing permalink references jump|\n|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|'
};

//--
//-- Translateable strings
//--

// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone

merge(config.options,{
	txtUserName: "YourName"});

merge(config.tasks,{
	save: {text: "save", tooltip: "Save your changes to this TiddlyWiki", action: saveChanges},
	sync: {text: "sync", tooltip: "Synchronise changes with other TiddlyWiki files and servers", content: '<<sync>>'},
	importTask: {text: "import", tooltip: "Import tiddlers and plugins from other TiddlyWiki files and servers", content: '<<importTiddlers>>'},
	tweak: {text: "tweak", tooltip: "Tweak the appearance and behaviour of TiddlyWiki", content: '<<options>>'},
	upgrade: {text: "upgrade", tooltip: "Upgrade TiddlyWiki core code", content: '<<upgrade>>'},
	plugins: {text: "plugins", tooltip: "Manage installed plugins", content: '<<plugins>>'}
});

// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
	txtUserName: "Username for signing your edits",
	chkRegExpSearch: "Enable regular expressions for searches",
	chkCaseSensitiveSearch: "Case-sensitive searching",
	chkIncrementalSearch: "Incremental key-by-key searching",
	chkAnimate: "Enable animations",
	chkSaveBackups: "Keep backup file when saving changes",
	chkAutoSave: "Automatically save changes",
	chkGenerateAnRssFeed: "Generate an RSS feed when saving changes",
	chkSaveEmptyTemplate: "Generate an empty template when saving changes",
	chkOpenInNewWindow: "Open external links in a new window",
	chkToggleLinks: "Clicking on links to open tiddlers causes them to close",
	chkHttpReadOnly: "Hide editing features when viewed over HTTP",
	chkForceMinorUpdate: "Don't update modifier username and date when editing tiddlers",
	chkConfirmDelete: "Require confirmation before deleting tiddlers",
	chkInsertTabs: "Use the tab key to insert tab characters instead of moving between fields",
	txtBackupFolder: "Name of folder to use for backups",
	txtMaxEditRows: "Maximum number of rows in edit boxes",
	txtFileSystemCharSet: "Default character set for saving changes (Firefox/Mozilla only)"});

merge(config.messages,{
	customConfigError: "Problems were encountered loading plugins. See PluginManager for details",
	pluginError: "Error: %0",
	pluginDisabled: "Not executed because disabled via 'systemConfigDisable' tag",
	pluginForced: "Executed because forced via 'systemConfigForce' tag",
	pluginVersionError: "Not executed because this plugin needs a newer version of TiddlyWiki",
	nothingSelected: "Nothing is selected. You must select one or more items first",
	savedSnapshotError: "It appears that this TiddlyWiki has been incorrectly saved. Please see http://www.tiddlywiki.com/#Download for details",
	subtitleUnknown: "(unknown)",
	undefinedTiddlerToolTip: "The tiddler '%0' doesn't yet exist",
	shadowedTiddlerToolTip: "The tiddler '%0' doesn't yet exist, but has a pre-defined shadow value",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "External link to %0",
	noTags: "There are no tagged tiddlers",
	notFileUrlError: "You need to save this TiddlyWiki to a file before you can save changes",
	cantSaveError: "It's not possible to save changes. Possible reasons include:\n- your browser doesn't support saving (Firefox, Internet Explorer, Safari and Opera all work if properly configured)\n- the pathname to your TiddlyWiki file contains illegal characters\n- the TiddlyWiki HTML file has been moved or renamed",
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to save backup file",
	rssSaved: "RSS feed saved",
	rssFailed: "Failed to save RSS feed file",
	emptySaved: "Empty template saved",
	emptyFailed: "Failed to save empty template file",
	mainSaved: "Main TiddlyWiki file saved",
	mainFailed: "Failed to save main TiddlyWiki file. Your changes have not been saved",
	macroError: "Error in macro <<\%0>>",
	macroErrorDetails: "Error while executing macro <<\%0>>:\n%1",
	missingMacro: "No such macro",
	overwriteWarning: "A tiddler named '%0' already exists. Choose OK to overwrite it",
	unsavedChangesWarning: "WARNING! There are unsaved changes in TiddlyWiki\n\nChoose OK to save\nChoose CANCEL to discard",
	confirmExit: "--------------------------------\n\nThere are unsaved changes in TiddlyWiki. If you continue you will lose those changes\n\n--------------------------------",
	saveInstructions: "SaveChanges",
	unsupportedTWFormat: "Unsupported TiddlyWiki format '%0'",
	tiddlerSaveError: "Error when saving tiddler '%0'",
	tiddlerLoadError: "Error when loading tiddler '%0'",
	wrongSaveFormat: "Cannot save with storage format '%0'. Using standard format for save.",
	invalidFieldName: "Invalid field name %0",
	fieldCannotBeChanged: "Field '%0' cannot be changed",
	loadingMissingTiddler: "Attempting to retrieve the tiddler '%0' from the '%1' server at:\n\n'%2' in the workspace '%3'",
	upgradeDone: "The upgrade to version %0 is now complete\n\nClick 'OK' to reload the newly upgraded TiddlyWiki"});

merge(config.messages.messageClose,{
	text: "close",
	tooltip: "close this message area"});

config.messages.backstage = {
	open: {text: "backstage", tooltip: "Open the backstage area to perform authoring and editing tasks"},
	close: {text: "close", tooltip: "Close the backstage area"},
	prompt: "backstage: ",
	decal: {
		edit: {text: "edit", tooltip: "Edit the tiddler '%0'"}
	}
};

config.messages.listView = {
	tiddlerTooltip: "Click for the full text of this tiddler",
	previewUnavailable: "(preview not available)"
};

config.messages.dates.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"];
config.messages.dates.days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
config.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.messages.dates.shortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
config.messages.dates.daySuffixes = ["st","nd","rd","th","th","th","th","th","th","th",
		"th","th","th","th","th","th","th","th","th","th",
		"st","nd","rd","th","th","th","th","th","th","th",
		"st"];
config.messages.dates.am = "am";
config.messages.dates.pm = "pm";

merge(config.messages.tiddlerPopup,{
	});

merge(config.views.wikified.tag,{
	labelNoTags: "no tags",
	labelTags: "tags: ",
	openTag: "Open tag '%0'",
	tooltip: "Show tiddlers tagged with '%0'",
	openAllText: "Open all",
	openAllTooltip: "Open all of these tiddlers",
	popupNone: "No other tiddlers tagged with '%0'"});

merge(config.views.wikified,{
	defaultText: "The tiddler '%0' doesn't yet exist. Double-click to create it",
	defaultModifier: "(missing)",
	shadowModifier: "(built-in shadow tiddler)",
	dateFormat: "DD MMM YYYY",
	createdPrompt: "created"});

merge(config.views.editor,{
	tagPrompt: "Type tags separated with spaces, [[use double square brackets]] if necessary, or add existing",
	defaultText: "Type the text for '%0'"});

merge(config.views.editor.tagChooser,{
	text: "tags",
	tooltip: "Choose existing tags to add to this tiddler",
	popupNone: "There are no tags defined",
	tagTooltip: "Add the tag '%0'"});

merge(config.messages,{
	sizeTemplates:
		[
		{unit: 1024*1024*1024, template: "%0\u00a0GB"},
		{unit: 1024*1024, template: "%0\u00a0MB"},
		{unit: 1024, template: "%0\u00a0KB"},
		{unit: 1, template: "%0\u00a0B"}
		]});

merge(config.macros.search,{
	label: "search",
	prompt: "Search this TiddlyWiki",
	accessKey: "F",
	successMsg: "%0 tiddlers found matching %1",
	failureMsg: "No tiddlers found matching %0"});

merge(config.macros.tagging,{
	label: "tagging: ",
	labelNotTag: "not tagging",
	tooltip: "List of tiddlers tagged with '%0'"});

merge(config.macros.timeline,{
	dateFormat: "DD MMM YYYY"});

merge(config.macros.allTags,{
	tooltip: "Show tiddlers tagged with '%0'",
	noTags: "There are no tagged tiddlers"});

config.macros.list.all.prompt = "All tiddlers in alphabetical order";
config.macros.list.missing.prompt = "Tiddlers that have links to them but are not defined";
config.macros.list.orphans.prompt = "Tiddlers that are not linked to from any other tiddlers";
config.macros.list.shadowed.prompt = "Tiddlers shadowed with default contents";
config.macros.list.touched.prompt = "Tiddlers that have been modified locally";

merge(config.macros.closeAll,{
	label: "close all",
	prompt: "Close all displayed tiddlers (except any that are being edited)"});

merge(config.macros.permaview,{
	label: "permaview",
	prompt: "Link to an URL that retrieves all the currently displayed tiddlers"});

merge(config.macros.saveChanges,{
	label: "save changes",
	prompt: "Save all tiddlers to create a new TiddlyWiki",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "new tiddler",
	prompt: "Create a new tiddler",
	title: "New Tiddler",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "new journal",
	prompt: "Create a new tiddler from the current date and time",
	accessKey: "J"});

merge(config.macros.options,{
	wizardTitle: "Tweak advanced options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Show unknown options</input>",
	unknownDescription: "//(unknown)//",
	listViewTemplate: {
		columns: [
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'}
			]}
	});

merge(config.macros.plugins,{
	wizardTitle: "Manage plugins",
	step1Title: "Currently loaded plugins",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	skippedText: "(This plugin has not been executed because it was added since startup)",
	noPluginText: "There are no plugins installed",
	confirmDeleteText: "Are you sure you want to delete these plugins:\n\n%0",
	removeLabel: "remove systemConfig tag",
	removePrompt: "Remove systemConfig tag",
	deleteLabel: "delete",
	deletePrompt: "Delete these tiddlers forever",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Description', field: 'desc', title: "Description", type: 'String'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
			{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
			{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
			{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
			{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			]}
	});

merge(config.macros.toolbar,{
	moreLabel: "more",
	morePrompt: "Reveal further commands"
	});

merge(config.macros.refreshDisplay,{
	label: "refresh",
	prompt: "Redraw the entire TiddlyWiki display"
	});

merge(config.macros.importTiddlers,{
	readOnlyWarning: "You cannot import into a read-only TiddlyWiki file. Try opening it from a file:// URL",
	wizardTitle: "Import tiddlers from another file or server",
	step1Title: "Step 1: Locate the server or TiddlyWiki file",
	step1Html: "Specify the type of the server: <select name='selTypes'><option value=''>Choose...</option></select><br>Enter the URL or pathname here: <input type='text' size=50 name='txtPath'><br>...or browse for a file: <input type='file' size=50 name='txtBrowse'><br><hr>...or select a pre-defined feed: <select name='selFeeds'><option value=''>Choose...</option></select>",
	openLabel: "open",
	openPrompt: "Open the connection to this file or server",
	openError: "There were problems fetching the tiddlywiki file",
	statusOpenHost: "Opening the host",
	statusGetWorkspaceList: "Getting the list of available workspaces",
	step2Title: "Step 2: Choose the workspace",
	step2Html: "Enter a workspace name: <input type='text' size=50 name='txtWorkspace'><br>...or select a workspace: <select name='selWorkspace'><option value=''>Choose...</option></select>",
	cancelLabel: "cancel",
	cancelPrompt: "Cancel this import",
	statusOpenWorkspace: "Opening the workspace",
	statusGetTiddlerList: "Getting the list of available tiddlers",
	errorGettingTiddlerList: "Error getting list of tiddlers, click Cancel to try again",
	step3Title: "Step 3: Choose the tiddlers to import",
	step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Keep these tiddlers linked to this server so that you can synchronise subsequent changes</input><br><input type='checkbox' name='chkSave'>Save the details of this server in a 'systemServer' tiddler called:</input> <input type='text' size=25 name='txtSaveTiddler'>",
	importLabel: "import",
	importPrompt: "Import these tiddlers",
	confirmOverwriteText: "Are you sure you want to overwrite these tiddlers:\n\n%0",
	step4Title: "Step 4: Importing %0 tiddler(s)",
	step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
	doneLabel: "done",
	donePrompt: "Close this wizard",
	statusDoingImport: "Importing tiddlers",
	statusDoneImport: "All tiddlers imported",
	systemServerNamePattern: "%2 on %1",
	systemServerNamePatternNoWorkspace: "%1",
	confirmOverwriteSaveTiddler: "The tiddler '%0' already exists. Click 'OK' to overwrite it with the details of this server, or 'Cancel' to leave it unchanged",
	serverSaveTemplate: "|''Type:''|%0|\n|''URL:''|%1|\n|''Workspace:''|%2|\n\nThis tiddler was automatically created to record the details of this server",
	serverSaveModifier: "(System)",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
			{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
			],
		rowClasses: [
			]}
	});

merge(config.macros.upgrade,{
	wizardTitle: "Upgrade TiddlyWiki core code",
	step1Title: "Update or repair this TiddlyWiki to the latest release",
	step1Html: "You are about to upgrade to the latest release of the TiddlyWiki core code (from <a href='%0' class='externalLink' target='_blank'>%1</a>). Your content will be preserved across the upgrade.<br><br>Note that core upgrades have been known to interfere with older plugins. If you run into problems with the upgraded file, see <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
	errorCantUpgrade: "Unable to upgrade this TiddlyWiki. You can only perform upgrades on TiddlyWiki files stored locally",
	errorNotSaved: "You must save changes before you can perform an upgrade",
	step2Title: "Confirm the upgrade details",
	step2Html_downgrade: "You are about to downgrade to TiddlyWiki version %0 from %1.<br><br>Downgrading to an earlier version of the core code is not recommended",
	step2Html_restore: "This TiddlyWiki appears to be already using the latest version of the core code (%0).<br><br>You can continue to upgrade anyway to ensure that the core code hasn't been corrupted or damaged",
	step2Html_upgrade: "You are about to upgrade to TiddlyWiki version %0 from %1",
	upgradeLabel: "upgrade",
	upgradePrompt: "Prepare for the upgrade process",
	statusPreparingBackup: "Preparing backup",
	statusSavingBackup: "Saving backup file",
	errorSavingBackup: "There was a problem saving the backup file",
	statusLoadingCore: "Loading core code",
	errorLoadingCore: "Error loading the core code",
	errorCoreFormat: "Error with the new core code",
	statusSavingCore: "Saving the new core code",
	statusReloadingCore: "Reloading the new core code",
	startLabel: "start",
	startPrompt: "Start the upgrade process",
	cancelLabel: "cancel",
	cancelPrompt: "Cancel the upgrade process",
	step3Title: "Upgrade cancelled",
	step3Html: "You have cancelled the upgrade process"
	});

merge(config.macros.sync,{
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Server Type', field: 'serverType', title: "Server type", type: 'String'},
			{name: 'Server Host', field: 'serverHost', title: "Server host", type: 'String'},
			{name: 'Server Workspace', field: 'serverWorkspace', title: "Server workspace", type: 'String'},
			{name: 'Status', field: 'status', title: "Synchronisation status", type: 'String'},
			{name: 'Server URL', field: 'serverUrl', title: "Server URL", text: "View", type: 'Link'}
			],
		rowClasses: [
			],
		buttons: [
			{caption: "Sync these tiddlers", name: 'sync'}
			]},
	wizardTitle: "Synchronize with external servers and files",
	step1Title: "Choose the tiddlers you want to synchronize",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	syncLabel: "sync",
	syncPrompt: "Sync these tiddlers",
	hasChanged: "Changed while unplugged",
	hasNotChanged: "Unchanged while unplugged",
	syncStatusList: {
		none: {text: "...", display:null, className:'notChanged'},
		changedServer: {text: "Changed on server", display:null, className:'changedServer'},
		changedLocally: {text: "Changed while unplugged", display:null, className:'changedLocally'},
		changedBoth: {text: "Changed while unplugged and on server", display:null, className:'changedBoth'},
		notFound: {text: "Not found on server", display:null, className:'notFound'},
		putToServer: {text: "Saved update on server", display:null, className:'putToServer'},
		gotFromServer: {text: "Retrieved update from server", display:null, className:'gotFromServer'}
		}
	});

merge(config.macros.annotations,{
	});

merge(config.commands.closeTiddler,{
	text: "close",
	tooltip: "Close this tiddler"});

merge(config.commands.closeOthers,{
	text: "close others",
	tooltip: "Close all other tiddlers"});

merge(config.commands.editTiddler,{
	text: "edit",
	tooltip: "Edit this tiddler",
	readOnlyText: "view",
	readOnlyTooltip: "View the source of this tiddler"});

merge(config.commands.saveTiddler,{
	text: "done",
	tooltip: "Save changes to this tiddler"});

merge(config.commands.cancelTiddler,{
	text: "cancel",
	tooltip: "Undo changes to this tiddler",
	warning: "Are you sure you want to abandon your changes to '%0'?",
	readOnlyText: "done",
	readOnlyTooltip: "View this tiddler normally"});

merge(config.commands.deleteTiddler,{
	text: "delete",
	tooltip: "Delete this tiddler",
	warning: "Are you sure you want to delete '%0'?"});

merge(config.commands.permalink,{
	text: "permalink",
	tooltip: "Permalink for this tiddler"});

merge(config.commands.references,{
	text: "references",
	tooltip: "Show tiddlers that link to this one",
	popupNone: "No references"});

merge(config.commands.jump,{
	text: "jump",
	tooltip: "Jump to another open tiddler"});

merge(config.commands.syncing,{
	text: "syncing",
	tooltip: "Control synchronisation of this tiddler with a server or external file",
	currentlySyncing: "<div>Currently syncing via <span class='popupHighlight'>'%0'</span> to:</"+"div><div>host: <span class='popupHighlight'>%1</span></"+"div><div>workspace: <span class='popupHighlight'>%2</span></"+"div>", // Note escaping of closing <div> tag
	notCurrentlySyncing: "Not currently syncing",
	captionUnSync: "Stop synchronising this tiddler",
	chooseServer: "Synchronise this tiddler with another server:",
	currServerMarker: "\u25cf ",
	notCurrServerMarker: "  "});

merge(config.commands.fields,{
	text: "fields",
	tooltip: "Show the extended fields of this tiddler",
	emptyText: "There are no extended fields for this tiddler",
	listViewTemplate: {
		columns: [
			{name: 'Field', field: 'field', title: "Field", type: 'String'},
			{name: 'Value', field: 'value', title: "Value", type: 'String'}
			],
		rowClasses: [
			],
		buttons: [
			]}});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "[[GettingStarted]]",
	MainMenu: "[[GettingStarted]]",
	SiteTitle: "My TiddlyWiki",
	SiteSubtitle: "a reusable non-linear personal web notebook",
	SiteUrl: "http://www.tiddlywiki.com/",
	SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options \u00bb" "Change TiddlyWiki advanced options">>',
	SideBarTabs: '<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>',
	TabMore: '<<tabs txtMoreTab "Missing" "Missing tiddlers" TabMoreMissing "Orphans" "Orphaned tiddlers" TabMoreOrphans "Shadowed" "Shadowed tiddlers" TabMoreShadowed>>'
	});

merge(config.annotations,{
	AdvancedOptions: "This shadow tiddler provides access to several advanced options",
	ColorPalette: "These values in this shadow tiddler determine the colour scheme of the ~TiddlyWiki user interface",
	DefaultTiddlers: "The tiddlers listed in this shadow tiddler will be automatically displayed when ~TiddlyWiki starts up",
	EditTemplate: "The HTML template in this shadow tiddler determines how tiddlers look while they are being edited",
	GettingStarted: "This shadow tiddler provides basic usage instructions",
	ImportTiddlers: "This shadow tiddler provides access to importing tiddlers",
	MainMenu: "This shadow tiddler is used as the contents of the main menu in the left-hand column of the screen",
	MarkupPreHead: "This tiddler is inserted at the top of the <head> section of the TiddlyWiki HTML file",
	MarkupPostHead: "This tiddler is inserted at the bottom of the <head> section of the TiddlyWiki HTML file",
	MarkupPreBody: "This tiddler is inserted at the top of the <body> section of the TiddlyWiki HTML file",
	MarkupPostBody: "This tiddler is inserted at the end of the <body> section of the TiddlyWiki HTML file immediately after the script block",
	OptionsPanel: "This shadow tiddler is used as the contents of the options panel slider in the right-hand sidebar",
	PageTemplate: "The HTML template in this shadow tiddler determines the overall ~TiddlyWiki layout",
	PluginManager: "This shadow tiddler provides access to the plugin manager",
	SideBarOptions: "This shadow tiddler is used as the contents of the option panel in the right-hand sidebar",
	SideBarTabs: "This shadow tiddler is used as the contents of the tabs panel in the right-hand sidebar",
	SiteSubtitle: "This shadow tiddler is used as the second part of the page title",
	SiteTitle: "This shadow tiddler is used as the first part of the page title",
	SiteUrl: "This shadow tiddler should be set to the full target URL for publication",
	StyleSheetColors: "This shadow tiddler contains CSS definitions related to the color of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler",
	StyleSheet: "This tiddler can contain custom CSS definitions",
	StyleSheetLayout: "This shadow tiddler contains CSS definitions related to the layout of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler",
	StyleSheetLocale: "This shadow tiddler contains CSS definitions related to the translation locale",
	StyleSheetPrint: "This shadow tiddler contains CSS definitions for printing",
	TabAll: "This shadow tiddler contains the contents of the 'All' tab in the right-hand sidebar",
	TabMore: "This shadow tiddler contains the contents of the 'More' tab in the right-hand sidebar",
	TabMoreMissing: "This shadow tiddler contains the contents of the 'Missing' tab in the right-hand sidebar",
	TabMoreOrphans: "This shadow tiddler contains the contents of the 'Orphans' tab in the right-hand sidebar",
	TabMoreShadowed: "This shadow tiddler contains the contents of the 'Shadowed' tab in the right-hand sidebar",
	TabTags: "This shadow tiddler contains the contents of the 'Tags' tab in the right-hand sidebar",
	TabTimeline: "This shadow tiddler contains the contents of the 'Timeline' tab in the right-hand sidebar",
	ToolbarCommands: "This shadow tiddler determines which commands are shown in tiddler toolbars",
	ViewTemplate: "The HTML template in this shadow tiddler determines how tiddlers look"
	});

//--
//-- Main
//--

var params = null; // Command line parameters
var store = null; // TiddlyWiki storage
var story = null; // Main story
var formatter = null; // Default formatters for the wikifier
var anim = typeof Animator == "function" ? new Animator() : null; // Animation engine
var readOnly = false; // Whether we're in readonly mode
var highlightHack = null; // Embarrassing hack department...
var hadConfirmExit = false; // Don't warn more than once
var safeMode = false; // Disable all plugins and cookies
var showBackstage; // Whether to include the backstage area
var installedPlugins = []; // Information filled in when plugins are executed
var startingUp = false; // Whether we're in the process of starting up
var pluginInfo,tiddler; // Used to pass information to plugins in loadPlugins()

// Whether to use the JavaSaver applet
var useJavaSaver = (config.browser.isSafari || config.browser.isOpera) && (document.location.toString().substr(0,4) != "http");

// Starting up
function main()
{
	var t10,t9,t8,t7,t6,t5,t4,t3,t2,t1,t0 = new Date();
	startingUp = true;
	jQuery.noConflict();
	window.onbeforeunload = function(e) {if(window.confirmExit) return confirmExit();};
	params = getParameters();
	if(params)
		params = params.parseParams("open",null,false);
	store = new TiddlyWiki();
	invokeParamifier(params,"oninit");
	story = new Story("tiddlerDisplay","tiddler");
	addEvent(document,"click",Popup.onDocumentClick);
	saveTest();
	loadOptionsCookie();
	for(var s=0; s<config.notifyTiddlers.length; s++)
		store.addNotification(config.notifyTiddlers[s].name,config.notifyTiddlers[s].notify);
	t1 = new Date();
	loadShadowTiddlers();
	t2 = new Date();
	store.loadFromDiv("storeArea","store",true);
	t3 = new Date();
	invokeParamifier(params,"onload");
	t4 = new Date();
	readOnly = (window.location.protocol == "file:") ? false : config.options.chkHttpReadOnly;
	var pluginProblem = loadPlugins();
	t5 = new Date();
	formatter = new Formatter(config.formatters);
	invokeParamifier(params,"onconfig");
	story.switchTheme(config.options.txtTheme);
	showBackstage = !readOnly;
	t6 = new Date();
	for(var m in config.macros) {
		if(config.macros[m].init)
			config.macros[m].init();
	}
	t7 = new Date();
	store.notifyAll();
	t8 = new Date();
	restart();
	refreshDisplay();
	t9 = new Date();
	if(pluginProblem) {
		story.displayTiddler(null,"PluginManager");
		displayMessage(config.messages.customConfigError);
	}
	if(showBackstage)
		backstage.init();
	t10 = new Date();
	if(config.options.chkDisplayInstrumentation) {
		displayMessage("LoadShadows " + (t2-t1) + " ms");
		displayMessage("LoadFromDiv " + (t3-t2) + " ms");
		displayMessage("LoadPlugins " + (t5-t4) + " ms");
		displayMessage("Macro init " + (t7-t6) + " ms");
		displayMessage("Notify " + (t8-t7) + " ms");
		displayMessage("Restart " + (t9-t8) + " ms");
		displayMessage("Total: " + (t10-t0) + " ms");
	}
	startingUp = false;
}

// Restarting
function restart()
{
	invokeParamifier(params,"onstart");
	if(story.isEmpty()) {
		story.displayDefaultTiddlers();
	}
	window.scrollTo(0,0);
}

function saveTest()
{
	var s = document.getElementById("saveTest");
	if(s.hasChildNodes())
		alert(config.messages.savedSnapshotError);
	s.appendChild(document.createTextNode("savetest"));
}

function loadShadowTiddlers()
{
	var shadows = new TiddlyWiki();
	shadows.loadFromDiv("shadowArea","shadows",true);
	shadows.forEachTiddler(function(title,tiddler){config.shadowTiddlers[title] = tiddler.text;});
	delete shadows;
}

function loadPlugins()
{
	if(safeMode)
		return false;
	var tiddlers = store.getTaggedTiddlers("systemConfig");
	var toLoad = [];
	var nLoaded = 0;
	var map = {};
	var nPlugins = tiddlers.length;
	installedPlugins = [];
	for(var i=0; i<nPlugins; i++) {
		var p = getPluginInfo(tiddlers[i]);
		installedPlugins[i] = p;
		var n = p.Name;
		if(n)
			map[n] = p;
		n = p.Source;
		if(n)
			map[n] = p;
	}
	var visit = function(p) {
		if(!p || p.done)
			return;
		p.done = 1;
		var reqs = p.Requires;
		if(reqs) {
			reqs = reqs.readBracketedList();
			for(var i=0; i<reqs.length; i++)
				visit(map[reqs[i]]);
		}
		toLoad.push(p);
	};
	for(i=0; i<nPlugins; i++)
		visit(installedPlugins[i]);
	for(i=0; i<toLoad.length; i++) {
		p = toLoad[i];
		pluginInfo = p;
		tiddler = p.tiddler;
		if(isPluginExecutable(p)) {
			if(isPluginEnabled(p)) {
				p.executed = true;
				var startTime = new Date();
				try {
					if(tiddler.text)
						window.eval(tiddler.text);
					nLoaded++;
				} catch(ex) {
					p.log.push(config.messages.pluginError.format([exceptionText(ex)]));
					p.error = true;
				}
				pluginInfo.startupTime = String((new Date()) - startTime) + "ms";
			} else {
				nPlugins--;
			}
		} else {
			p.warning = true;
		}
	}
	return nLoaded != nPlugins;
}

function getPluginInfo(tiddler)
{
	var p = store.getTiddlerSlices(tiddler.title,["Name","Description","Version","Requires","CoreVersion","Date","Source","Author","License","Browsers"]);
	p.tiddler = tiddler;
	p.title = tiddler.title;
	p.log = [];
	return p;
}

// Check that a particular plugin is valid for execution
function isPluginExecutable(plugin)
{
	if(plugin.tiddler.isTagged("systemConfigForce")) {
		plugin.log.push(config.messages.pluginForced);
		return true;
	}
	if(plugin["CoreVersion"]) {
		var coreVersion = plugin["CoreVersion"].split(".");
		var w = parseInt(coreVersion[0],10) - version.major;
		if(w == 0 && coreVersion[1])
			w = parseInt(coreVersion[1],10) - version.minor;
		if(w == 0 && coreVersion[2])
			w = parseInt(coreVersion[2],10) - version.revision;
		if(w > 0) {
			plugin.log.push(config.messages.pluginVersionError);
			return false;
		}
	}
	return true;
}

function isPluginEnabled(plugin)
{
	if(plugin.tiddler.isTagged("systemConfigDisable")) {
		plugin.log.push(config.messages.pluginDisabled);
		return false;
	}
	return true;
}

function invokeMacro(place,macro,params,wikifier,tiddler)
{
	try {
		var m = config.macros[macro];
		if(m && m.handler) {
			var tiddlerElem = story.findContainingTiddler(place);
			window.tiddler = tiddlerElem ? store.getTiddler(tiddlerElem.getAttribute("tiddler")) : null;
			window.place = place;
			m.handler(place,macro,params.readMacroParams(),wikifier,params,tiddler);
		} else {
			createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,config.messages.missingMacro]));
		}
	} catch(ex) {
		createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,ex.toString()]));
	}
}

//--
//-- Paramifiers
//--

function getParameters()
{
	var p = null;
	if(window.location.hash) {
		p = decodeURIComponent(window.location.hash.substr(1));
		if(config.browser.firefoxDate != null && config.browser.firefoxDate[1] < "20051111")
			p = convertUTF8ToUnicode(p);
	}
	return p;
}

function invokeParamifier(params,handler)
{
	if(!params || params.length == undefined || params.length <= 1)
		return;
	for(var i=1; i<params.length; i++) {
		var p = config.paramifiers[params[i].name];
		if(p && p[handler] instanceof Function)
			p[handler](params[i].value);
		else {
			var h = config.optionHandlers[params[i].name.substr(0,3)];
			if(h && h.set instanceof Function)
				h.set(params[i].name,params[i].value);
		}
	}
}

config.paramifiers = {};

config.paramifiers.start = {
	oninit: function(v) {
		safeMode = v.toLowerCase() == "safe";
	}
};

config.paramifiers.open = {
	onstart: function(v) {
		if(!readOnly || store.tiddlerExists(v) || store.isShadowTiddler(v))
			story.displayTiddler("bottom",v,null,false,null);
	}
};

config.paramifiers.story = {
	onstart: function(v) {
		var list = store.getTiddlerText(v,"").parseParams("open",null,false);
		invokeParamifier(list,"onstart");
	}
};

config.paramifiers.search = {
	onstart: function(v) {
		story.search(v,false,false);
	}
};

config.paramifiers.searchRegExp = {
	onstart: function(v) {
		story.prototype.search(v,false,true);
	}
};

config.paramifiers.tag = {
	onstart: function(v) {
		story.displayTiddlers(null,store.filterTiddlers("[tag["+v+"]]"),null,false,null);
	}
};

config.paramifiers.newTiddler = {
	onstart: function(v) {
		if(!readOnly) {
			story.displayTiddler(null,v,DEFAULT_EDIT_TEMPLATE);
			story.focusTiddler(v,"text");
		}
	}
};

config.paramifiers.newJournal = {
	onstart: function(v) {
		if(!readOnly) {
			var now = new Date();
			var title = now.formatString(v.trim());
			story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
			story.focusTiddler(title,"text");
		}
	}
};

config.paramifiers.readOnly = {
	onconfig: function(v) {
		var p = v.toLowerCase();
		readOnly = p == "yes" ? true : (p == "no" ? false : readOnly);
	}
};

config.paramifiers.theme = {
	onconfig: function(v) {
		story.switchTheme(v);
	}
};

config.paramifiers.upgrade = {
	onstart: function(v) {
		upgradeFrom(v);
	}
};

config.paramifiers.recent= {
	onstart: function(v) {
		var titles=[];
		var tiddlers=store.getTiddlers("modified","excludeLists").reverse();
		for(var i=0; i<v && i<tiddlers.length; i++)
			titles.push(tiddlers[i].title);
		story.displayTiddlers(null,titles);
	}
};

config.paramifiers.filter = {
	onstart: function(v) {
		story.displayTiddlers(null,store.filterTiddlers(v),null,false);
	}
};

//--
//-- Formatter helpers
//--

function Formatter(formatters)
{
	this.formatters = [];
	var pattern = [];
	for(var n=0; n<formatters.length; n++) {
		pattern.push("(" + formatters[n].match + ")");
		this.formatters.push(formatters[n]);
	}
	this.formatterRegExp = new RegExp(pattern.join("|"),"mg");
}

config.formatterHelpers = {

	createElementAndWikify: function(w)
	{
		w.subWikifyTerm(createTiddlyElement(w.output,this.element),this.termRegExp);
	},

	inlineCssHelper: function(w)
	{
		var styles = [];
		config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
		var lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
			var s,v;
			if(lookaheadMatch[1]) {
				s = lookaheadMatch[1].unDash();
				v = lookaheadMatch[2];
			} else {
				s = lookaheadMatch[3].unDash();
				v = lookaheadMatch[4];
			}
			if(s=="bgcolor")
				s = "backgroundColor";
			styles.push({style: s, value: v});
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
			config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
			lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
		}
		return styles;
	},

	applyCssHelper: function(e,styles)
	{
		for(var t=0; t< styles.length; t++) {
			try {
				e.style[styles[t].style] = styles[t].value;
			} catch (ex) {
			}
		}
	},

	enclosedTextHelper: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var text = lookaheadMatch[1];
			if(config.browser.isIE)
				text = text.replace(/\n/g,"\r");
			createTiddlyElement(w.output,this.element,null,null,text);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	},

	isExternalLink: function(link)
	{
		if(store.tiddlerExists(link) || store.isShadowTiddler(link)) {
			return false;
		}
		var urlRegExp = new RegExp(config.textPrimitives.urlPattern,"mg");
		if(urlRegExp.exec(link)) {
			return true;
		}
		if(link.indexOf(".")!=-1 || link.indexOf("\\")!=-1 || link.indexOf("/")!=-1 || link.indexOf("#")!=-1) {
			return true;
		}
		return false;
	}

};

//--
//-- Standard formatters
//--

config.formatters = [
{
	name: "table",
	match: "^\\|(?:[^\\n]*)\\|(?:[fhck]?)$",
	lookaheadRegExp: /^\|([^\n]*)\|([fhck]?)$/mg,
	rowTermRegExp: /(\|(?:[fhck]?)$\n?)/mg,
	cellRegExp: /(?:\|([^\n\|]*)\|)|(\|[fhck]?$\n?)/mg,
	cellTermRegExp: /((?:\x20*)\|)/mg,
	rowTypes: {"c":"caption", "h":"thead", "":"tbody", "f":"tfoot"},
	handler: function(w)
	{
		var table = createTiddlyElement(w.output,"table",null,"twtable");
		var prevColumns = [];
		var currRowType = null;
		var rowContainer;
		var rowCount = 0;
		w.nextMatch = w.matchStart;
		this.lookaheadRegExp.lastIndex = w.nextMatch;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
			var nextRowType = lookaheadMatch[2];
			if(nextRowType == "k") {
				table.className = lookaheadMatch[1];
				w.nextMatch += lookaheadMatch[0].length+1;
			} else {
				if(nextRowType != currRowType) {
					rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);
					currRowType = nextRowType;
				}
				if(currRowType == "c") {
					// Caption
					w.nextMatch++;
					if(rowContainer != table.firstChild)
						table.insertBefore(rowContainer,table.firstChild);
					rowContainer.setAttribute("align",rowCount == 0?"top":"bottom");
					w.subWikifyTerm(rowContainer,this.rowTermRegExp);
				} else {
					var theRow = createTiddlyElement(rowContainer,"tr",null,(rowCount&1)?"oddRow":"evenRow");
					theRow.onmouseover = function() {addClass(this,"hoverRow");};
					theRow.onmouseout = function() {removeClass(this,"hoverRow");};
					this.rowHandler(w,theRow,prevColumns);
					rowCount++;
				}
			}
			this.lookaheadRegExp.lastIndex = w.nextMatch;
			lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		}
	},
	rowHandler: function(w,e,prevColumns)
	{
		var col = 0;
		var colSpanCount = 1;
		var prevCell = null;
		this.cellRegExp.lastIndex = w.nextMatch;
		var cellMatch = this.cellRegExp.exec(w.source);
		while(cellMatch && cellMatch.index == w.nextMatch) {
			if(cellMatch[1] == "~") {
				// Rowspan
				var last = prevColumns[col];
				if(last) {
					last.rowSpanCount++;
					last.element.setAttribute("rowspan",last.rowSpanCount);
					last.element.setAttribute("rowSpan",last.rowSpanCount); // Needed for IE
					last.element.valign = "center";
				}
				w.nextMatch = this.cellRegExp.lastIndex-1;
			} else if(cellMatch[1] == ">") {
				// Colspan
				colSpanCount++;
				w.nextMatch = this.cellRegExp.lastIndex-1;
			} else if(cellMatch[2]) {
				// End of row
				if(prevCell && colSpanCount > 1) {
					prevCell.setAttribute("colspan",colSpanCount);
					prevCell.setAttribute("colSpan",colSpanCount); // Needed for IE
				}
				w.nextMatch = this.cellRegExp.lastIndex;
				break;
			} else {
				// Cell
				w.nextMatch++;
				var styles = config.formatterHelpers.inlineCssHelper(w);
				var spaceLeft = false;
				var chr = w.source.substr(w.nextMatch,1);
				while(chr == " ") {
					spaceLeft = true;
					w.nextMatch++;
					chr = w.source.substr(w.nextMatch,1);
				}
				var cell;
				if(chr == "!") {
					cell = createTiddlyElement(e,"th");
					w.nextMatch++;
				} else {
					cell = createTiddlyElement(e,"td");
				}
				prevCell = cell;
				prevColumns[col] = {rowSpanCount:1,element:cell};
				if(colSpanCount > 1) {
					cell.setAttribute("colspan",colSpanCount);
					cell.setAttribute("colSpan",colSpanCount); // Needed for IE
					colSpanCount = 1;
				}
				config.formatterHelpers.applyCssHelper(cell,styles);
				w.subWikifyTerm(cell,this.cellTermRegExp);
				if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight
					cell.align = spaceLeft ? "center" : "left";
				else if(spaceLeft)
					cell.align = "right";
				w.nextMatch--;
			}
			col++;
			this.cellRegExp.lastIndex = w.nextMatch;
			cellMatch = this.cellRegExp.exec(w.source);
		}
	}
},

{
	name: "heading",
	match: "^!{1,6}",
	termRegExp: /(\n)/mg,
	handler: function(w)
	{
		w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength),this.termRegExp);
	}
},

{
	name: "list",
	match: "^(?:[\\*#;:]+)",
	lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg,
	termRegExp: /(\n)/mg,
	handler: function(w)
	{
		var stack = [w.output];
		var currLevel = 0, currType = null;
		var listLevel, listType, itemType, baseType;
		w.nextMatch = w.matchStart;
		this.lookaheadRegExp.lastIndex = w.nextMatch;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
			if(lookaheadMatch[1]) {
				listType = "ul";
				itemType = "li";
			} else if(lookaheadMatch[2]) {
				listType = "ol";
				itemType = "li";
			} else if(lookaheadMatch[3]) {
				listType = "dl";
				itemType = "dt";
			} else if(lookaheadMatch[4]) {
				listType = "dl";
				itemType = "dd";
			}
			if(!baseType)
				baseType = listType;
			listLevel = lookaheadMatch[0].length;
			w.nextMatch += lookaheadMatch[0].length;
			var t;
			if(listLevel > currLevel) {
				for(t=currLevel; t<listLevel; t++) {
					var target = (currLevel == 0) ? stack[stack.length-1] : stack[stack.length-1].lastChild;
					stack.push(createTiddlyElement(target,listType));
				}
			} else if(listType!=baseType && listLevel==1) {
				w.nextMatch -= lookaheadMatch[0].length;
				return;
			} else if(listLevel < currLevel) {
				for(t=currLevel; t>listLevel; t--)
					stack.pop();
			} else if(listLevel == currLevel && listType != currType) {
				stack.pop();
				stack.push(createTiddlyElement(stack[stack.length-1].lastChild,listType));
			}
			currLevel = listLevel;
			currType = listType;
			var e = createTiddlyElement(stack[stack.length-1],itemType);
			w.subWikifyTerm(e,this.termRegExp);
			this.lookaheadRegExp.lastIndex = w.nextMatch;
			lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		}
	}
},

{
	name: "quoteByBlock",
	match: "^<<<\\n",
	termRegExp: /(^<<<(\n|$))/mg,
	element: "blockquote",
	handler: config.formatterHelpers.createElementAndWikify
},

{
	name: "quoteByLine",
	match: "^>+",
	lookaheadRegExp: /^>+/mg,
	termRegExp: /(\n)/mg,
	element: "blockquote",
	handler: function(w)
	{
		var stack = [w.output];
		var currLevel = 0;
		var newLevel = w.matchLength;
		var t;
		do {
			if(newLevel > currLevel) {
				for(t=currLevel; t<newLevel; t++)
					stack.push(createTiddlyElement(stack[stack.length-1],this.element));
			} else if(newLevel < currLevel) {
				for(t=currLevel; t>newLevel; t--)
					stack.pop();
			}
			currLevel = newLevel;
			w.subWikifyTerm(stack[stack.length-1],this.termRegExp);
			createTiddlyElement(stack[stack.length-1],"br");
			this.lookaheadRegExp.lastIndex = w.nextMatch;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;
			if(matched) {
				newLevel = lookaheadMatch[0].length;
				w.nextMatch += lookaheadMatch[0].length;
			}
		} while(matched);
	}
},

{
	name: "rule",
	match: "^----+$\\n?|<hr ?/?>\\n?",
	handler: function(w)
	{
		createTiddlyElement(w.output,"hr");
	}
},

{
	name: "monospacedByLine",
	match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|<!--\\{\\{\\{-->)\\n",
	element: "pre",
	handler: function(w)
	{
		switch(w.matchText) {
		case "/*{{{*/\n": // CSS
			this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\/\*\}\}\}\*\/$\n?)/mg;
			break;
		case "{{{\n": // monospaced block
			this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\}\}\}$\n?)/mg;
			break;
		case "//{{{\n": // plugin
			this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\/\/\}\}\}$\n?)/mg;
			break;
		case "<!--{{{-->\n": //template
			this.lookaheadRegExp = /<!--\{\{\{-->\n*((?:^[^\n]*\n)+?)(\n*^<!--\}\}\}-->$\n?)/mg;
			break;
		default:
			break;
		}
		config.formatterHelpers.enclosedTextHelper.call(this,w);
	}
},

{
	name: "wikifyComment",
	match: "^(?:/\\*\\*\\*|<!---)\\n",
	handler: function(w)
	{
		var termRegExp = (w.matchText == "/***\n") ? (/(^\*\*\*\/\n)/mg) : (/(^--->\n)/mg);
		w.subWikifyTerm(w.output,termRegExp);
	}
},

{
	name: "macro",
	match: "<<",
	lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) {
			w.nextMatch = this.lookaheadRegExp.lastIndex;
			invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);
		}
	}
},

{
	name: "prettyLink",
	match: "\\[\\[",
	lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg,
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var e;
			var text = lookaheadMatch[1];
			if(lookaheadMatch[3]) {
				// Pretty bracketted link
				var link = lookaheadMatch[3];
				e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link)) ?
						createExternalLink(w.output,link) : createTiddlyLink(w.output,decodeURIComponent(link),false,null,w.isStatic,w.tiddler);
			} else {
				// Simple bracketted link
				e = createTiddlyLink(w.output,decodeURIComponent(text),false,null,w.isStatic,w.tiddler);
			}
			createTiddlyText(e,text);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
},

{
	name: "wikiLink",
	match: config.textPrimitives.unWikiLink+"?"+config.textPrimitives.wikiLink,
	handler: function(w)
	{
		if(w.matchText.substr(0,1) == config.textPrimitives.unWikiLink) {
			w.outputText(w.output,w.matchStart+1,w.nextMatch);
			return;
		}
		if(w.matchStart > 0) {
			var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg");
			preRegExp.lastIndex = w.matchStart-1;
			var preMatch = preRegExp.exec(w.source);
			if(preMatch.index == w.matchStart-1) {
				w.outputText(w.output,w.matchStart,w.nextMatch);
				return;
			}
		}
		if(w.autoLinkWikiWords || store.isShadowTiddler(w.matchText)) {
			var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic,w.tiddler);
			w.outputText(link,w.matchStart,w.nextMatch);
		} else {
			w.outputText(w.output,w.matchStart,w.nextMatch);
		}
	}
},

{
	name: "urlLink",
	match: config.textPrimitives.urlPattern,
	handler: function(w)
	{
		w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch);
	}
},

{
	name: "image",
	match: "\\[[<>]?[Ii][Mm][Gg]\\[",
	lookaheadRegExp: /\[([<]?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg,
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var e = w.output;
			if(lookaheadMatch[5]) {
				var link = lookaheadMatch[5];
				e = config.formatterHelpers.isExternalLink(link) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);
				addClass(e,"imageLink");
			}
			var img = createTiddlyElement(e,"img");
			if(lookaheadMatch[1])
				img.align = "left";
			else if(lookaheadMatch[2])
				img.align = "right";
			if(lookaheadMatch[3]) {
				img.title = lookaheadMatch[3];
				img.setAttribute("alt",lookaheadMatch[3]);
			}
			img.src = lookaheadMatch[4];
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
},

{
	name: "html",
	match: "<[Hh][Tt][Mm][Ll]>",
	lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg,
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1];
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
},

{
	name: "commentByBlock",
	match: "/%",
	lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg,
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
			w.nextMatch = this.lookaheadRegExp.lastIndex;
	}
},

{
	name: "characterFormat",
	match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{",
	handler: function(w)
	{
		switch(w.matchText) {
		case "''":
			w.subWikifyTerm(w.output.appendChild(document.createElement("strong")),/('')/mg);
			break;
		case "//":
			w.subWikifyTerm(createTiddlyElement(w.output,"em"),/(\/\/)/mg);
			break;
		case "__":
			w.subWikifyTerm(createTiddlyElement(w.output,"u"),/(__)/mg);
			break;
		case "^^":
			w.subWikifyTerm(createTiddlyElement(w.output,"sup"),/(\^\^)/mg);
			break;
		case "~~":
			w.subWikifyTerm(createTiddlyElement(w.output,"sub"),/(~~)/mg);
			break;
		case "--":
			w.subWikifyTerm(createTiddlyElement(w.output,"strike"),/(--)/mg);
			break;
		case "{{{":
			var lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg;
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source);
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
				createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]);
				w.nextMatch = lookaheadRegExp.lastIndex;
			}
			break;
		}
	}
},

{
	name: "customFormat",
	match: "@@|\\{\\{",
	handler: function(w)
	{
		switch(w.matchText) {
		case "@@":
			var e = createTiddlyElement(w.output,"span");
			var styles = config.formatterHelpers.inlineCssHelper(w);
			if(styles.length == 0)
				e.className = "marked";
			else
				config.formatterHelpers.applyCssHelper(e,styles);
			w.subWikifyTerm(e,/(@@)/mg);
			break;
		case "{{":
			var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source);
			if(lookaheadMatch) {
				w.nextMatch = lookaheadRegExp.lastIndex;
				e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
				w.subWikifyTerm(e,/(\}\}\})/mg);
			}
			break;
		}
	}
},

{
	name: "mdash",
	match: "--",
	handler: function(w)
	{
		createTiddlyElement(w.output,"span").innerHTML = "&mdash;";
	}
},

{
	name: "lineBreak",
	match: "\\n|<br ?/?>",
	handler: function(w)
	{
		createTiddlyElement(w.output,"br");
	}
},

{
	name: "rawText",
	match: "\\\"{3}|<nowiki>",
	lookaheadRegExp: /(?:\"{3}|<nowiki>)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg,
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
},

{
	name: "htmlEntitiesEncoding",
	match: "(?:(?:&#?[a-zA-Z0-9]{2,8};|.)(?:&#?(?:x0*(?:3[0-6][0-9a-fA-F]|1D[c-fC-F][0-9a-fA-F]|20[d-fD-F][0-9a-fA-F]|FE2[0-9a-fA-F])|0*(?:76[89]|7[7-9][0-9]|8[0-7][0-9]|761[6-9]|76[2-7][0-9]|84[0-3][0-9]|844[0-7]|6505[6-9]|6506[0-9]|6507[0-1]));)+|&#?[a-zA-Z0-9]{2,8};)",
	handler: function(w)
	{
		createTiddlyElement(w.output,"span").innerHTML = w.matchText;
	}
}

];

//--
//-- Wikifier
//--

function getParser(tiddler,format)
{
	if(tiddler) {
		if(!format)
			format = tiddler.fields["wikiformat"];
		var i;
		if(format) {
			for(i in config.parsers) {
				if(format == config.parsers[i].format)
					return config.parsers[i];
			}
		} else {
			for(i in config.parsers) {
				if(tiddler.isTagged(config.parsers[i].formatTag))
					return config.parsers[i];
			}
		}
	}
	return formatter;
}

function wikify(source,output,highlightRegExp,tiddler)
{
	if(source) {
		var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
		var t0 = new Date();
		wikifier.subWikify(output);
		if(tiddler && config.options.chkDisplayInstrumentation)
			displayMessage("wikify:" +tiddler.title+ " in " + (new Date()-t0) + " ms");
	}
}

function wikifyStatic(source,highlightRegExp,tiddler,format)
{
	var e = createTiddlyElement(document.body,"pre");
	e.style.display = "none";
	var html = "";
	if(source && source != "") {
		if(!tiddler)
			tiddler = new Tiddler("temp");
		var wikifier = new Wikifier(source,getParser(tiddler,format),highlightRegExp,tiddler);
		wikifier.isStatic = true;
		wikifier.subWikify(e);
		html = e.innerHTML;
		removeNode(e);
	}
	return html;
}

function wikifyPlain(title,theStore,limit)
{
	if(!theStore)
		theStore = store;
	if(theStore.tiddlerExists(title) || theStore.isShadowTiddler(title)) {
		return wikifyPlainText(theStore.getTiddlerText(title),limit,tiddler);
	} else {
		return "";
	}
}

function wikifyPlainText(text,limit,tiddler)
{
	if(limit > 0)
		text = text.substr(0,limit);
	var wikifier = new Wikifier(text,formatter,null,tiddler);
	return wikifier.wikifyPlain();
}

function highlightify(source,output,highlightRegExp,tiddler)
{
	if(source) {
		var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);
		wikifier.outputText(output,0,source.length);
	}
}

function Wikifier(source,formatter,highlightRegExp,tiddler)
{
	this.source = source;
	this.output = null;
	this.formatter = formatter;
	this.nextMatch = 0;
	this.autoLinkWikiWords = tiddler && tiddler.autoLinkWikiWords() == false ? false : true;
	this.highlightRegExp = highlightRegExp;
	this.highlightMatch = null;
	this.isStatic = false;
	if(highlightRegExp) {
		highlightRegExp.lastIndex = 0;
		this.highlightMatch = highlightRegExp.exec(source);
	}
	this.tiddler = tiddler;
}

Wikifier.prototype.wikifyPlain = function()
{
	var e = createTiddlyElement(document.body,"div");
	e.style.display = "none";
	this.subWikify(e);
	var text = getPlainText(e);
	removeNode(e);
	return text;
};

Wikifier.prototype.subWikify = function(output,terminator)
{
	try {
		if(terminator)
			this.subWikifyTerm(output,new RegExp("(" + terminator + ")","mg"));
		else
			this.subWikifyUnterm(output);
	} catch(ex) {
		showException(ex);
	}
};

Wikifier.prototype.subWikifyUnterm = function(output)
{
	var oldOutput = this.output;
	this.output = output;
	this.formatter.formatterRegExp.lastIndex = this.nextMatch;
	var formatterMatch = this.formatter.formatterRegExp.exec(this.source);
	while(formatterMatch) {
		// Output any text before the match
		if(formatterMatch.index > this.nextMatch)
			this.outputText(this.output,this.nextMatch,formatterMatch.index);
		// Set the match parameters for the handler
		this.matchStart = formatterMatch.index;
		this.matchLength = formatterMatch[0].length;
		this.matchText = formatterMatch[0];
		this.nextMatch = this.formatter.formatterRegExp.lastIndex;
		for(var t=1; t<formatterMatch.length; t++) {
			if(formatterMatch[t]) {
				this.formatter.formatters[t-1].handler(this);
				this.formatter.formatterRegExp.lastIndex = this.nextMatch;
				break;
			}
		}
		formatterMatch = this.formatter.formatterRegExp.exec(this.source);
	}
	if(this.nextMatch < this.source.length) {
		this.outputText(this.output,this.nextMatch,this.source.length);
		this.nextMatch = this.source.length;
	}
	this.output = oldOutput;
};

Wikifier.prototype.subWikifyTerm = function(output,terminatorRegExp)
{
	var oldOutput = this.output;
	this.output = output;
	terminatorRegExp.lastIndex = this.nextMatch;
	var terminatorMatch = terminatorRegExp.exec(this.source);
	this.formatter.formatterRegExp.lastIndex = this.nextMatch;
	var formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
	while(terminatorMatch || formatterMatch) {
		if(terminatorMatch && (!formatterMatch || terminatorMatch.index <= formatterMatch.index)) {
			if(terminatorMatch.index > this.nextMatch)
				this.outputText(this.output,this.nextMatch,terminatorMatch.index);
			this.matchText = terminatorMatch[1];
			this.matchLength = terminatorMatch[1].length;
			this.matchStart = terminatorMatch.index;
			this.nextMatch = this.matchStart + this.matchLength;
			this.output = oldOutput;
			return;
		}
		if(formatterMatch.index > this.nextMatch)
			this.outputText(this.output,this.nextMatch,formatterMatch.index);
		this.matchStart = formatterMatch.index;
		this.matchLength = formatterMatch[0].length;
		this.matchText = formatterMatch[0];
		this.nextMatch = this.formatter.formatterRegExp.lastIndex;
		for(var t=1; t<formatterMatch.length; t++) {
			if(formatterMatch[t]) {
				this.formatter.formatters[t-1].handler(this);
				this.formatter.formatterRegExp.lastIndex = this.nextMatch;
				break;
			}
		}
		terminatorRegExp.lastIndex = this.nextMatch;
		terminatorMatch = terminatorRegExp.exec(this.source);
		formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
	}
	if(this.nextMatch < this.source.length) {
		this.outputText(this.output,this.nextMatch,this.source.length);
		this.nextMatch = this.source.length;
	}
	this.output = oldOutput;
};

Wikifier.prototype.outputText = function(place,startPos,endPos)
{
	while(this.highlightMatch && (this.highlightRegExp.lastIndex > startPos) && (this.highlightMatch.index < endPos) && (startPos < endPos)) {
		if(this.highlightMatch.index > startPos) {
			createTiddlyText(place,this.source.substring(startPos,this.highlightMatch.index));
			startPos = this.highlightMatch.index;
		}
		var highlightEnd = Math.min(this.highlightRegExp.lastIndex,endPos);
		var theHighlight = createTiddlyElement(place,"span",null,"highlight",this.source.substring(startPos,highlightEnd));
		startPos = highlightEnd;
		if(startPos >= this.highlightRegExp.lastIndex)
			this.highlightMatch = this.highlightRegExp.exec(this.source);
	}
	if(startPos < endPos) {
		createTiddlyText(place,this.source.substring(startPos,endPos));
	}
};

//--
//-- Macro definitions
//--

config.macros.today.handler = function(place,macroName,params)
{
	var now = new Date();
	var text = params[0] ? now.formatString(params[0].trim()) : now.toLocaleString();
	createTiddlyElement(place,"span",null,null,text);
};

config.macros.version.handler = function(place)
{
	createTiddlyElement(place,"span",null,null,formatVersion());
};

config.macros.list.handler = function(place,macroName,params)
{
	var type = params[0] || "all";
	var list = document.createElement("ul");
	place.appendChild(list);
	if(this[type].prompt)
		createTiddlyElement(list,"li",null,"listTitle",this[type].prompt);
	var results;
	if(this[type].handler)
		results = this[type].handler(params);
	for(var t = 0; t < results.length; t++) {
		var li = document.createElement("li");
		list.appendChild(li);
		createTiddlyLink(li,typeof results[t] == "string" ? results[t] : results[t].title,true);
	}
};

config.macros.list.all.handler = function(params)
{
	return store.reverseLookup("tags","excludeLists",false,"title");
};

config.macros.list.missing.handler = function(params)
{
	return store.getMissingLinks();
};

config.macros.list.orphans.handler = function(params)
{
	return store.getOrphans();
};

config.macros.list.shadowed.handler = function(params)
{
	return store.getShadowed();
};

config.macros.list.touched.handler = function(params)
{
	return store.getTouched();
};

config.macros.list.filter.handler = function(params)
{
	var filter = params[1];
	var results = [];
	if(filter) {
		var tiddlers = store.filterTiddlers(filter);
		for(var t=0; t<tiddlers.length; t++)
			results.push(tiddlers[t].title);
	}
	return results;
};

config.macros.allTags.handler = function(place,macroName,params)
{
	var tags = store.getTags(params[0]);
	var ul = createTiddlyElement(place,"ul");
	if(tags.length == 0)
		createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
	for(var t=0; t<tags.length; t++) {
		var title = tags[t][0];
		var info = getTiddlyLinkInfo(title);
		var li = createTiddlyElement(ul,"li");
		var btn = createTiddlyButton(li,title + " (" + tags[t][1] + ")",this.tooltip.format([title]),onClickTag,info.classes);
		btn.setAttribute("tag",title);
		btn.setAttribute("refresh","link");
		btn.setAttribute("tiddlyLink",title);
	}
};

config.macros.timeline.handler = function(place,macroName,params)
{
	var field = params[0] || "modified";
	var tiddlers = store.reverseLookup("tags","excludeLists",false,field);
	var lastDay = "";
	var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1])) : 0;
	var dateFormat = params[2] || this.dateFormat;
	for(var t=tiddlers.length-1; t>=last; t--) {
		var tiddler = tiddlers[t];
		var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
		if(theDay != lastDay) {
			var ul = document.createElement("ul");
			place.appendChild(ul);
			createTiddlyElement(ul,"li",null,"listTitle",tiddler[field].formatString(dateFormat));
			lastDay = theDay;
		}
		createTiddlyElement(ul,"li",null,"listLink").appendChild(createTiddlyLink(place,tiddler.title,true));
	}
};

config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	params = paramString.parseParams("name",null,true,false,true);
	var names = params[0]["name"];
	var tiddlerName = names[0];
	var className = names[1] || null;
	var args = params[0]["with"];
	var wrapper = createTiddlyElement(place,"span",null,className);
	if(!args) {
		wrapper.setAttribute("refresh","content");
		wrapper.setAttribute("tiddler",tiddlerName);
	}
	var text = store.getTiddlerText(tiddlerName);
	if(text) {
		var stack = config.macros.tiddler.tiddlerStack;
		if(stack.indexOf(tiddlerName) !== -1)
			return;
		stack.push(tiddlerName);
		try {
			var n = args ? Math.min(args.length,9) : 0;
			for(var i=0; i<n; i++) {
				var placeholderRE = new RegExp("\\$" + (i + 1),"mg");
				text = text.replace(placeholderRE,args[i]);
			}
			config.macros.tiddler.renderText(wrapper,text,tiddlerName,params);
		} finally {
			stack.pop();
		}
	}
};

config.macros.tiddler.renderText = function(place,text,tiddlerName,params)
{
	wikify(text,place,null,store.getTiddler(tiddlerName));
};

config.macros.tiddler.tiddlerStack = [];

config.macros.tag.handler = function(place,macroName,params)
{
	createTagButton(place,params[0],null,params[1],params[2]);
};

config.macros.tags.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	params = paramString.parseParams("anon",null,true,false,false);
	var ul = createTiddlyElement(place,"ul");
	var title = getParam(params,"anon","");
	if(title && store.tiddlerExists(title))
		tiddler = store.getTiddler(title);
	var sep = getParam(params,"sep"," ");
	var lingo = config.views.wikified.tag;
	var prompt = tiddler.tags.length == 0 ? lingo.labelNoTags : lingo.labelTags;
	createTiddlyElement(ul,"li",null,"listTitle",prompt.format([tiddler.title]));
	for(var t=0; t<tiddler.tags.length; t++) {
		createTagButton(createTiddlyElement(ul,"li"),tiddler.tags[t],tiddler.title);
		if(t<tiddler.tags.length-1)
			createTiddlyText(ul,sep);
	}
};

config.macros.tagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	params = paramString.parseParams("anon",null,true,false,false);
	var ul = createTiddlyElement(place,"ul");
	var title = getParam(params,"anon","");
	if(title == "" && tiddler instanceof Tiddler)
		title = tiddler.title;
	var sep = getParam(params,"sep"," ");
	ul.setAttribute("title",this.tooltip.format([title]));
	var tagged = store.getTaggedTiddlers(title);
	var prompt = tagged.length == 0 ? this.labelNotTag : this.label;
	createTiddlyElement(ul,"li",null,"listTitle",prompt.format([title,tagged.length]));
	for(var t=0; t<tagged.length; t++) {
		createTiddlyLink(createTiddlyElement(ul,"li"),tagged[t].title,true);
		if(t<tagged.length-1)
			createTiddlyText(ul,sep);
	}
};

config.macros.closeAll.handler = function(place)
{
	createTiddlyButton(place,this.label,this.prompt,this.onClick);
};

config.macros.closeAll.onClick = function(e)
{
	story.closeAllTiddlers();
	return false;
};

config.macros.permaview.handler = function(place)
{
	createTiddlyButton(place,this.label,this.prompt,this.onClick);
};

config.macros.permaview.onClick = function(e)
{
	story.permaView();
	return false;
};

config.macros.saveChanges.handler = function(place,macroName,params)
{
	if(!readOnly)
		createTiddlyButton(place,params[0] || this.label,params[1] || this.prompt,this.onClick,null,null,this.accessKey);
};

config.macros.saveChanges.onClick = function(e)
{
	saveChanges();
	return false;
};

config.macros.slider.onClickSlider = function(ev)
{
	var e = ev || window.event;
	var n = this.nextSibling;
	var cookie = n.getAttribute("cookie");
	var isOpen = n.style.display != "none";
	if(config.options.chkAnimate && anim && typeof Slider == "function")
		anim.startAnimating(new Slider(n,!isOpen,null,"none"));
	else
		n.style.display = isOpen ? "none" : "block";
	config.options[cookie] = !isOpen;
	saveOptionCookie(cookie);
	return false;
};

config.macros.slider.createSlider = function(place,cookie,title,tooltip)
{
	var c = cookie || "";
	var btn = createTiddlyButton(place,title,tooltip,this.onClickSlider);
	var panel = createTiddlyElement(null,"div",null,"sliderPanel");
	panel.setAttribute("cookie",c);
	panel.style.display = config.options[c] ? "block" : "none";
	place.appendChild(panel);
	return panel;
};

config.macros.slider.handler = function(place,macroName,params)
{
	var panel = this.createSlider(place,params[0],params[2],params[3]);
	var text = store.getTiddlerText(params[1]);
	panel.setAttribute("refresh","content");
	panel.setAttribute("tiddler",params[1]);
	if(text)
		wikify(text,panel,null,store.getTiddler(params[1]));
};

// <<gradient [[tiddler name]] vert|horiz rgb rgb rgb rgb... >>
config.macros.gradient.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	var panel = wikifier ? createTiddlyElement(place,"div",null,"gradient") : place;
	panel.style.position = "relative";
	panel.style.overflow = "hidden";
	panel.style.zIndex = "0";
	if(wikifier) {
		var styles = config.formatterHelpers.inlineCssHelper(wikifier);
		config.formatterHelpers.applyCssHelper(panel,styles);
	}
	params = paramString.parseParams("color");
	var locolors = [], hicolors = [];
	for(var t=2; t<params.length; t++) {
		var c = params[t].value;
		if(params[t].name == "snap") {
			hicolors[hicolors.length-1] = c;
		} else {
			locolors.push(c);
			hicolors.push(c);
		}
	}
	drawGradient(panel,params[1].value != "vert",locolors,hicolors);
	if(wikifier)
		wikifier.subWikify(panel,">>");
	if(document.all) {
		panel.style.height = "100%";
		panel.style.width = "100%";
	}
};

config.macros.message.handler = function(place,macroName,params)
{
	if(params[0]) {
		var names = params[0].split(".");
		var lookupMessage = function(root,nameIndex) {
				if(names[nameIndex] in root) {
					if(nameIndex < names.length-1)
						return (lookupMessage(root[names[nameIndex]],nameIndex+1));
					else
						return root[names[nameIndex]];
				} else
					return null;
			};
		var m = lookupMessage(config,0);
		if(m == null)
			m = lookupMessage(window,0);
		createTiddlyText(place,m.toString().format(params.splice(1)));
	}
};


config.macros.view.views = {
	text: function(value,place,params,wikifier,paramString,tiddler) {
		highlightify(value,place,highlightHack,tiddler);
	},
	link: function(value,place,params,wikifier,paramString,tiddler) {
		createTiddlyLink(place,value,true);
	},
	wikified: function(value,place,params,wikifier,paramString,tiddler) {
		if(params[2])
			value=params[2].unescapeLineBreaks().format([value]);
		wikify(value,place,highlightHack,tiddler);
	},
	date: function(value,place,params,wikifier,paramString,tiddler) {
		value = Date.convertFromYYYYMMDDHHMM(value);
		createTiddlyText(place,value.formatString(params[2] ? params[2] : config.views.wikified.dateFormat));
	}
};

config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	if((tiddler instanceof Tiddler) && params[0]) {
		var value = store.getValue(tiddler,params[0]);
		if(value) {
			var type = params[1] || config.macros.view.defaultView;
			var handler = config.macros.view.views[type];
			if(handler)
				handler(value,place,params,wikifier,paramString,tiddler);
		}
	}
};

config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	var field = params[0];
	var rows = params[1] || 0;
	var defVal = params[2] || '';
	if((tiddler instanceof Tiddler) && field) {
		story.setDirty(tiddler.title,true);
		var e,v;
		if(field != "text" && !rows) {
			e = createTiddlyElement(null,"input");
			if(tiddler.isReadOnly())
				e.setAttribute("readOnly","readOnly");
			e.setAttribute("edit",field);
			e.setAttribute("type","text");
			e.value = store.getValue(tiddler,field) || defVal;
			e.setAttribute("size","40");
			e.setAttribute("autocomplete","off");
			place.appendChild(e);
		} else {
			var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
			var wrapper2 = createTiddlyElement(wrapper1,"div");
			e = createTiddlyElement(wrapper2,"textarea");
			if(tiddler.isReadOnly())
				e.setAttribute("readOnly","readOnly");
			e.value = v = store.getValue(tiddler,field) || defVal;
			rows = rows || 10;
			var lines = v.match(/\n/mg);
			var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);
			if(lines != null && lines.length > rows)
				rows = lines.length + 5;
			rows = Math.min(rows,maxLines);
			e.setAttribute("rows",rows);
			e.setAttribute("edit",field);
			place.appendChild(wrapper1);
		}
		return e;
	}
};

config.macros.tagChooser.onClick = function(ev)
{
	var e = ev || window.event;
	var lingo = config.views.editor.tagChooser;
	var popup = Popup.create(this);
	var tags = store.getTags(this.getAttribute("tags"));
	if(tags.length == 0)
		createTiddlyText(createTiddlyElement(popup,"li"),lingo.popupNone);
	for(var t=0; t<tags.length; t++) {
		var tag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
		tag.setAttribute("tag",tags[t][0]);
		tag.setAttribute("tiddler",this.getAttribute("tiddler"));
	}
	Popup.show();
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
	return false;
};

config.macros.tagChooser.onTagClick = function(ev)
{
	var e = ev || window.event;
	if(e.metaKey || e.ctrlKey) stopEvent(e); //# keep popup open on CTRL-click
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	if(!readOnly)
		story.setTiddlerTag(title,tag,0);
	return false;
};

config.macros.tagChooser.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	if(tiddler instanceof Tiddler) {
		var lingo = config.views.editor.tagChooser;
		var btn = createTiddlyButton(place,lingo.text,lingo.tooltip,this.onClick);
		btn.setAttribute("tiddler",tiddler.title);
		btn.setAttribute("tags",params[0]);
	}
};

config.macros.refreshDisplay.handler = function(place)
{
	createTiddlyButton(place,this.label,this.prompt,this.onClick);
};

config.macros.refreshDisplay.onClick = function(e)
{
	refreshAll();
	return false;
};

config.macros.annotations.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	var title = tiddler ? tiddler.title : null;
	var a = title ? config.annotations[title] : null;
	if(!tiddler || !title || !a)
		return;
	var text = a.format([title]);
	wikify(text,createTiddlyElement(place,"div",null,"annotation"),null,tiddler);
};

//--
//-- NewTiddler and NewJournal macros
//--

config.macros.newTiddler.createNewTiddlerButton = function(place,title,params,label,prompt,accessKey,newFocus,isJournal)
{
	var tags = [];
	for(var t=1; t<params.length; t++) {
		if((params[t].name == "anon" && t != 1) || (params[t].name == "tag"))
			tags.push(params[t].value);
	}
	label = getParam(params,"label",label);
	prompt = getParam(params,"prompt",prompt);
	accessKey = getParam(params,"accessKey",accessKey);
	newFocus = getParam(params,"focus",newFocus);
	var customFields = getParam(params,"fields","");
	if(!customFields && !store.isShadowTiddler(title))
		customFields = String.encodeHashMap(config.defaultCustomFields);
	var btn = createTiddlyButton(place,label,prompt,this.onClickNewTiddler,null,null,accessKey);
	btn.setAttribute("newTitle",title);
	btn.setAttribute("isJournal",isJournal ? "true" : "false");
	if(tags.length > 0)
		btn.setAttribute("params",tags.join("|"));
	btn.setAttribute("newFocus",newFocus);
	btn.setAttribute("newTemplate",getParam(params,"template",DEFAULT_EDIT_TEMPLATE));
	if(customFields !== "")
		btn.setAttribute("customFields",customFields);
	var text = getParam(params,"text");
	if(text !== undefined)
		btn.setAttribute("newText",text);
	return btn;
};

config.macros.newTiddler.onClickNewTiddler = function()
{
	var title = this.getAttribute("newTitle");
	if(this.getAttribute("isJournal") == "true") {
		title = new Date().formatString(title.trim());
	}
	var params = this.getAttribute("params");
	var tags = params ? params.split("|") : [];
	var focus = this.getAttribute("newFocus");
	var template = this.getAttribute("newTemplate");
	var customFields = this.getAttribute("customFields");
	if(!customFields && !store.isShadowTiddler(title))
		customFields = String.encodeHashMap(config.defaultCustomFields);
	story.displayTiddler(null,title,template,false,null,null);
	var tiddlerElem = story.getTiddler(title);
	if(customFields)
		story.addCustomFields(tiddlerElem,customFields);
	var text = this.getAttribute("newText");
	if(typeof text == "string" && story.getTiddlerField(title,"text"))
		story.getTiddlerField(title,"text").value = text.format([title]);
	for(var t=0;t<tags.length;t++)
		story.setTiddlerTag(title,tags[t],+1);
	story.focusTiddler(title,focus);
	return false;
};

config.macros.newTiddler.handler = function(place,macroName,params,wikifier,paramString)
{
	if(!readOnly) {
		params = paramString.parseParams("anon",null,true,false,false);
		var title = params[1] && params[1].name == "anon" ? params[1].value : this.title;
		title = getParam(params,"title",title);
		this.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"title",false);
	}
};

config.macros.newJournal.handler = function(place,macroName,params,wikifier,paramString)
{
	if(!readOnly) {
		params = paramString.parseParams("anon",null,true,false,false);
		var title = params[1] && params[1].name == "anon" ? params[1].value : config.macros.timeline.dateFormat;
		title = getParam(params,"title",title);
		config.macros.newTiddler.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"text",true);
	}
};

//--
//-- Search macro
//--

config.macros.search.handler = function(place,macroName,params)
{
	var searchTimeout = null;
	var btn = createTiddlyButton(place,this.label,this.prompt,this.onClick,"searchButton");
	var txt = createTiddlyElement(null,"input",null,"txtOptionInput searchField");
	if(params[0])
		txt.value = params[0];
	if(config.browser.isSafari) {
		txt.setAttribute("type","search");
		txt.setAttribute("results","5");
	} else {
		txt.setAttribute("type","text");
	}
	place.appendChild(txt);
	txt.onkeyup = this.onKeyPress;
	txt.onfocus = this.onFocus;
	txt.setAttribute("size",this.sizeTextbox);
	txt.setAttribute("accessKey",this.accessKey);
	txt.setAttribute("autocomplete","off");
	txt.setAttribute("lastSearchText","");
};

// Global because there's only ever one outstanding incremental search timer
config.macros.search.timeout = null;

config.macros.search.doSearch = function(txt)
{
	if(txt.value.length > 0) {
		story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
		txt.setAttribute("lastSearchText",txt.value);
	}
};

config.macros.search.onClick = function(e)
{
	config.macros.search.doSearch(this.nextSibling);
	return false;
};

config.macros.search.onKeyPress = function(ev)
{
	var e = ev || window.event;
	switch(e.keyCode) {
		case 13: // Ctrl-Enter
		case 10: // Ctrl-Enter on IE PC
			config.macros.search.doSearch(this);
			break;
		case 27: // Escape
			this.value = "";
			clearMessage();
			break;
	}
	if(config.options.chkIncrementalSearch) {
		if(this.value.length > 2) {
			if(this.value != this.getAttribute("lastSearchText")) {
				if(config.macros.search.timeout)
					clearTimeout(config.macros.search.timeout);
				var txt = this;
				config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
			}
		} else {
			if(config.macros.search.timeout)
				clearTimeout(config.macros.search.timeout);
		}
	}
};

config.macros.search.onFocus = function(e)
{
	this.select();
};

//--
//-- Tabs macro
//--

config.macros.tabs.handler = function(place,macroName,params)
{
	var cookie = params[0];
	var numTabs = (params.length-1)/3;
	var wrapper = createTiddlyElement(null,"div",null,"tabsetWrapper " + cookie);
	var tabset = createTiddlyElement(wrapper,"div",null,"tabset");
	tabset.setAttribute("cookie",cookie);
	var validTab = false;
	for(var t=0; t<numTabs; t++) {
		var label = params[t*3+1];
		var prompt = params[t*3+2];
		var content = params[t*3+3];
		var tab = createTiddlyButton(tabset,label,prompt,this.onClickTab,"tab tabUnselected");
		tab.setAttribute("tab",label);
		tab.setAttribute("content",content);
		tab.title = prompt;
		if(config.options[cookie] == label)
			validTab = true;
	}
	if(!validTab)
		config.options[cookie] = params[1];
	place.appendChild(wrapper);
	this.switchTab(tabset,config.options[cookie]);
};

config.macros.tabs.onClickTab = function(e)
{
	config.macros.tabs.switchTab(this.parentNode,this.getAttribute("tab"));
	return false;
};

config.macros.tabs.switchTab = function(tabset,tab)
{
	var cookie = tabset.getAttribute("cookie");
	var theTab = null;
	var nodes = tabset.childNodes;
	for(var t=0; t<nodes.length; t++) {
		if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab) {
			theTab = nodes[t];
			theTab.className = "tab tabSelected";
		} else {
			nodes[t].className = "tab tabUnselected";
		}
	}
	if(theTab) {
		if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")
			removeNode(tabset.nextSibling);
		var tabContent = createTiddlyElement(null,"div",null,"tabContents");
		tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);
		var contentTitle = theTab.getAttribute("content");
		wikify(store.getTiddlerText(contentTitle),tabContent,null,store.getTiddler(contentTitle));
		if(cookie) {
			config.options[cookie] = tab;
			saveOptionCookie(cookie);
		}
	}
};

//--
//-- Tiddler toolbar
//--

// Create a toolbar command button
config.macros.toolbar.createCommand = function(place,commandName,tiddler,className)
{
	if(typeof commandName != "string") {
		var c = null;
		for(var t in config.commands) {
			if(config.commands[t] == commandName)
				c = t;
		}
		commandName = c;
	}
	if((tiddler instanceof Tiddler) && (typeof commandName == "string")) {
		var command = config.commands[commandName];
		if(command.isEnabled ? command.isEnabled(tiddler) : this.isCommandEnabled(command,tiddler)) {
			var text = command.getText ? command.getText(tiddler) : this.getCommandText(command,tiddler);
			var tooltip = command.getTooltip ? command.getTooltip(tiddler) : this.getCommandTooltip(command,tiddler);
			var cmd;
			switch(command.type) {
			case "popup":
				cmd = this.onClickPopup;
				break;
			case "command":
			default:
				cmd = this.onClickCommand;
				break;
			}
			var btn = createTiddlyButton(null,text,tooltip,cmd);
			btn.setAttribute("commandName",commandName);
			btn.setAttribute("tiddler",tiddler.title);
			if(className)
				addClass(btn,className);
			place.appendChild(btn);
		}
	}
};

config.macros.toolbar.isCommandEnabled = function(command,tiddler)
{
	var title = tiddler.title;
	var ro = tiddler.isReadOnly();
	var shadow = store.isShadowTiddler(title) && !store.tiddlerExists(title);
	return (!ro || (ro && !command.hideReadOnly)) && !(shadow && command.hideShadow);
};

config.macros.toolbar.getCommandText = function(command,tiddler)
{
	return tiddler.isReadOnly() && command.readOnlyText || command.text;
};

config.macros.toolbar.getCommandTooltip = function(command,tiddler)
{
	return tiddler.isReadOnly() && command.readOnlyTooltip || command.tooltip;
};

config.macros.toolbar.onClickCommand = function(ev)
{
	var e = ev || window.event;
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
	var command = config.commands[this.getAttribute("commandName")];
	return command.handler(e,this,this.getAttribute("tiddler"));
};

config.macros.toolbar.onClickPopup = function(ev)
{
	var e = ev || window.event;
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
	var popup = Popup.create(this);
	var command = config.commands[this.getAttribute("commandName")];
	var title = this.getAttribute("tiddler");
	var tiddler = store.fetchTiddler(title);
	popup.setAttribute("tiddler",title);
	command.handlePopup(popup,title);
	Popup.show();
	return false;
};

// Invoke the first command encountered from a given place that is tagged with a specified class
config.macros.toolbar.invokeCommand = function(place,className,event)
{
	var children = place.getElementsByTagName("a");
	for(var t=0; t<children.length; t++) {
		var c = children[t];
		if(hasClass(c,className) && c.getAttribute && c.getAttribute("commandName")) {
			if(c.onclick instanceof Function)
				c.onclick.call(c,event);
			break;
		}
	}
};

config.macros.toolbar.onClickMore = function(ev)
{
	var e = this.nextSibling;
	e.style.display = "inline";
	removeNode(this);
	return false;
};

config.macros.toolbar.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	for(var t=0; t<params.length; t++) {
		var c = params[t];
		switch(c) {
		case '>':
			var btn = createTiddlyButton(place,this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore);
			addClass(btn,"moreCommand");
			var e = createTiddlyElement(place,"span",null,"moreCommand");
			e.style.display = "none";
			place = e;
			break;
		default:
			var className = "";
			switch(c.substr(0,1)) {
			case "+":
				className = "defaultCommand";
				c = c.substr(1);
				break;
			case "-":
				className = "cancelCommand";
				c = c.substr(1);
				break;
			}
			if(c in config.commands)
				this.createCommand(place,c,tiddler,className);
			break;
		}
	}
};

//--
//-- Menu and toolbar commands
//--

config.commands.closeTiddler.handler = function(event,src,title)
{
	if(story.isDirty(title) && !readOnly) {
		if(!confirm(config.commands.cancelTiddler.warning.format([title])))
			return false;
	}
	story.setDirty(title,false);
	story.closeTiddler(title,true);
	return false;
};

config.commands.closeOthers.handler = function(event,src,title)
{
	story.closeAllTiddlers(title);
	return false;
};

config.commands.editTiddler.handler = function(event,src,title)
{
	clearMessage();
	var tiddlerElem = story.getTiddler(title);
	var fields = tiddlerElem.getAttribute("tiddlyFields");
	story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE,false,null,fields);
	story.focusTiddler(title,config.options.txtEditorFocus||"text");
	return false;
};

config.commands.saveTiddler.handler = function(event,src,title)
{
	var newTitle = story.saveTiddler(title,event.shiftKey);
	if(newTitle)
		story.displayTiddler(null,newTitle);
	return false;
};

config.commands.cancelTiddler.handler = function(event,src,title)
{
	if(story.hasChanges(title) && !readOnly) {
		if(!confirm(this.warning.format([title])))
			return false;
	}
	story.setDirty(title,false);
	story.displayTiddler(null,title);
	return false;
};

config.commands.deleteTiddler.handler = function(event,src,title)
{
	var deleteIt = true;
	if(config.options.chkConfirmDelete)
		deleteIt = confirm(this.warning.format([title]));
	if(deleteIt) {
		store.removeTiddler(title);
		story.closeTiddler(title,true);
		autoSaveChanges();
	}
	return false;
};

config.commands.permalink.handler = function(event,src,title)
{
	var t = encodeURIComponent(String.encodeTiddlyLink(title));
	if(window.location.hash != t)
		window.location.hash = t;
	return false;
};

config.commands.references.handlePopup = function(popup,title)
{
	var references = store.getReferringTiddlers(title);
	var c = false;
	for(var r=0; r<references.length; r++) {
		if(references[r].title != title && !references[r].isTagged("excludeLists")) {
			createTiddlyLink(createTiddlyElement(popup,"li"),references[r].title,true);
			c = true;
		}
	}
	if(!c)
		createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),this.popupNone);
};

config.commands.jump.handlePopup = function(popup,title)
{
	story.forEachTiddler(function(title,element) {
		createTiddlyLink(createTiddlyElement(popup,"li"),title,true,null,false,null,true);
		});
};

config.commands.syncing.handlePopup = function(popup,title)
{
	var tiddler = store.fetchTiddler(title);
	if(!tiddler)
		return;
	var serverType = tiddler.getServerType();
	var serverHost = tiddler.fields['server.host'];
	var serverWorkspace = tiddler.fields['server.workspace'];
	if(!serverWorkspace)
		serverWorkspace = "";
	if(serverType) {
		var e = createTiddlyElement(popup,"li",null,"popupMessage");
		e.innerHTML = config.commands.syncing.currentlySyncing.format([serverType,serverHost,serverWorkspace]);
	} else {
		createTiddlyElement(popup,"li",null,"popupMessage",config.commands.syncing.notCurrentlySyncing);
	}
	if(serverType) {
		createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
		var btn = createTiddlyButton(createTiddlyElement(popup,"li"),this.captionUnSync,null,config.commands.syncing.onChooseServer);
		btn.setAttribute("tiddler",title);
		btn.setAttribute("server.type","");
	}
	createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
	createTiddlyElement(popup,"li",null,"popupMessage",config.commands.syncing.chooseServer);
	var feeds = store.getTaggedTiddlers("systemServer","title");
	for(var t=0; t<feeds.length; t++) {
		var f = feeds[t];
		var feedServerType = store.getTiddlerSlice(f.title,"Type");
		if(!feedServerType)
			feedServerType = "file";
		var feedServerHost = store.getTiddlerSlice(f.title,"URL");
		if(!feedServerHost)
			feedServerHost = "";
		var feedServerWorkspace = store.getTiddlerSlice(f.title,"Workspace");
		if(!feedServerWorkspace)
			feedServerWorkspace = "";
		var caption = f.title;
		if(serverType == feedServerType && serverHost == feedServerHost && serverWorkspace == feedServerWorkspace) {
			caption = config.commands.syncing.currServerMarker + caption;
		} else {
			caption = config.commands.syncing.notCurrServerMarker + caption;
		}
		btn = createTiddlyButton(createTiddlyElement(popup,"li"),caption,null,config.commands.syncing.onChooseServer);
		btn.setAttribute("tiddler",title);
		btn.setAttribute("server.type",feedServerType);
		btn.setAttribute("server.host",feedServerHost);
		btn.setAttribute("server.workspace",feedServerWorkspace);
	}
};

config.commands.syncing.onChooseServer = function(e)
{
	var tiddler = this.getAttribute("tiddler");
	var serverType = this.getAttribute("server.type");
	if(serverType) {
		store.addTiddlerFields(tiddler,{
			"server.type": serverType,
			"server.host": this.getAttribute("server.host"),
			"server.workspace": this.getAttribute("server.workspace")
			});
	} else {
		store.setValue(tiddler,"server",null);
	}
	return false;
};

config.commands.fields.handlePopup = function(popup,title)
{
	var tiddler = store.fetchTiddler(title);
	if(!tiddler)
		return;
	var items = [];
	store.forEachField(tiddler,function(tiddler,fieldName,value){items.push({field:fieldName,value:value});},true);
	items.sort(function(a,b) {return a.field < b.field ? -1 : (a.field == b.field ? 0 : +1);});
	if(items.length > 0)
		ListView.create(popup,items,this.listViewTemplate);
	else
		createTiddlyElement(popup,"div",null,null,this.emptyText);
};

//--
//-- Tiddler() object
//--

function Tiddler(title)
{
	this.title = title;
	this.text = "";
	this.modifier = null;
	this.created = new Date();
	this.modified = this.created;
	this.links = [];
	this.linksUpdated = false;
	this.tags = [];
	this.fields = {};
	return this;
}

Tiddler.prototype.getLinks = function()
{
	if(this.linksUpdated==false)
		this.changed();
	return this.links;
};

// Returns the fields that are inherited in string field:"value" field2:"value2" format
Tiddler.prototype.getInheritedFields = function()
{
	var f = {};
	for(var i in this.fields) {
		if(i=="server.host" || i=="server.workspace" || i=="wikiformat"|| i=="server.type") {
			f[i] = this.fields[i];
		}
	}
	return String.encodeHashMap(f);
};

// Increment the changeCount of a tiddler
Tiddler.prototype.incChangeCount = function()
{
	var c = this.fields['changecount'];
	c = c ? parseInt(c,10) : 0;
	this.fields['changecount'] = String(c+1);
};

// Clear the changeCount of a tiddler
Tiddler.prototype.clearChangeCount = function()
{
	if(this.fields['changecount']) {
		delete this.fields['changecount'];
	}
};

Tiddler.prototype.doNotSave = function()
{
	return this.fields['doNotSave'];
};

// Returns true if the tiddler has been updated since the tiddler was created or downloaded
Tiddler.prototype.isTouched = function()
{
	var changeCount = this.fields['changecount'];
	if(changeCount === undefined)
		changeCount = 0;
	return changeCount > 0;
};

// Change the text and other attributes of a tiddler
Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields)
{
	this.assign(title,text,modifier,modified,tags,created,fields);
	this.changed();
	return this;
};

// Change the text and other attributes of a tiddler without triggered a tiddler.changed() call
Tiddler.prototype.assign = function(title,text,modifier,modified,tags,created,fields)
{
	if(title != undefined)
		this.title = title;
	if(text != undefined)
		this.text = text;
	if(modifier != undefined)
		this.modifier = modifier;
	if(modified != undefined)
		this.modified = modified;
	if(created != undefined)
		this.created = created;
	if(fields != undefined)
		this.fields = fields;
	if(tags != undefined)
		this.tags = (typeof tags == "string") ? tags.readBracketedList() : tags;
	else if(this.tags == undefined)
		this.tags = [];
	return this;
};

// Get the tags for a tiddler as a string (space delimited, using [[brackets]] for tags containing spaces)
Tiddler.prototype.getTags = function()
{
	return String.encodeTiddlyLinkList(this.tags);
};

// Test if a tiddler carries a tag
Tiddler.prototype.isTagged = function(tag)
{
	return this.tags.indexOf(tag) != -1;
};

// Static method to convert "\n" to newlines, "\s" to "\"
Tiddler.unescapeLineBreaks = function(text)
{
	return text ? text.unescapeLineBreaks() : "";
};

// Convert newlines to "\n", "\" to "\s"
Tiddler.prototype.escapeLineBreaks = function()
{
	return this.text.escapeLineBreaks();
};

// Updates the secondary information (like links[] array) after a change to a tiddler
Tiddler.prototype.changed = function()
{
	this.links = [];
	var text = this.text;
	// remove 'quoted' text before scanning tiddler source
	text = text.replace(/\/%((?:.|\n)*?)%\//g,"").
		replace(/\{{3}((?:.|\n)*?)\}{3}/g,"").
		replace(/"""((?:.|\n)*?)"""/g,"").
		replace(/\<nowiki\>((?:.|\n)*?)\<\/nowiki\>/g,"").
		replace(/\<html\>((?:.|\n)*?)\<\/html\>/g,"").
		replace(/\<script((?:.|\n)*?)\<\/script\>/g,"");
	var t = this.autoLinkWikiWords() ? 0 : 1;
	var tiddlerLinkRegExp = t==0 ? config.textPrimitives.tiddlerAnyLinkRegExp : config.textPrimitives.tiddlerForcedLinkRegExp;
	tiddlerLinkRegExp.lastIndex = 0;
	var formatMatch = tiddlerLinkRegExp.exec(text);
	while(formatMatch) {
		var lastIndex = tiddlerLinkRegExp.lastIndex;
		if(t==0 && formatMatch[1] && formatMatch[1] != this.title) {
			// wikiWordLink
			if(formatMatch.index > 0) {
				var preRegExp = new RegExp(config.textPrimitives.unWikiLink+"|"+config.textPrimitives.anyLetter,"mg");
				preRegExp.lastIndex = formatMatch.index-1;
				var preMatch = preRegExp.exec(text);
				if(preMatch.index != formatMatch.index-1)
					this.links.pushUnique(formatMatch[1]);
			} else {
				this.links.pushUnique(formatMatch[1]);
			}
		}
		else if(formatMatch[2-t] && !config.formatterHelpers.isExternalLink(formatMatch[3-t])) // titledBrackettedLink
			this.links.pushUnique(formatMatch[3-t]);
		else if(formatMatch[4-t] && formatMatch[4-t] != this.title) // brackettedLink
			this.links.pushUnique(formatMatch[4-t]);
		tiddlerLinkRegExp.lastIndex = lastIndex;
		formatMatch = tiddlerLinkRegExp.exec(text);
	}
	this.linksUpdated = true;
};

Tiddler.prototype.getSubtitle = function()
{
	var modifier = this.modifier;
	if(!modifier)
		modifier = config.messages.subtitleUnknown;
	var modified = this.modified;
	if(modified)
		modified = modified.toLocaleString();
	else
		modified = config.messages.subtitleUnknown;
	return config.messages.tiddlerLinkTooltip.format([this.title,modifier,modified]);
};

Tiddler.prototype.isReadOnly = function()
{
	return readOnly;
};

Tiddler.prototype.autoLinkWikiWords = function()
{
	return !(this.isTagged("systemConfig") || this.isTagged("excludeMissing"));
};

Tiddler.prototype.generateFingerprint = function()
{
	return "0x" + Crypto.hexSha1Str(this.text);
};

Tiddler.prototype.getServerType = function()
{
	var serverType = null;
	if(this.fields['server.type'])
		serverType = this.fields['server.type'];
	if(!serverType)
		serverType = this.fields['wikiformat'];
	if(serverType && !config.adaptors[serverType])
		serverType = null;
	return serverType;
};

Tiddler.prototype.getAdaptor = function()
{
	var serverType = this.getServerType();
	return serverType ? new config.adaptors[serverType]() : null;
};

//--
//-- TiddlyWiki() object contains Tiddler()s
//--

function TiddlyWiki()
{
	var tiddlers = {}; // Hashmap by name of tiddlers
	this.tiddlersUpdated = false;
	this.namedNotifications = []; // Array of {name:,notify:} of notification functions
	this.notificationLevel = 0;
	this.slices = {}; // map tiddlerName->(map sliceName->sliceValue). Lazy.
	this.clear = function() {
		tiddlers = {};
		this.setDirty(false);
	};
	this.fetchTiddler = function(title) {
		var t = tiddlers[title];
		return t instanceof Tiddler ? t : null;
	};
	this.deleteTiddler = function(title) {
		delete this.slices[title];
		delete tiddlers[title];
	};
	this.addTiddler = function(tiddler) {
		delete this.slices[tiddler.title];
		tiddlers[tiddler.title] = tiddler;
	};
	this.forEachTiddler = function(callback) {
		for(var t in tiddlers) {
			var tiddler = tiddlers[t];
			if(tiddler instanceof Tiddler)
				callback.call(this,t,tiddler);
		}
	};
}

TiddlyWiki.prototype.setDirty = function(dirty)
{
	this.dirty = dirty;
};

TiddlyWiki.prototype.isDirty = function()
{
	return this.dirty;
};

TiddlyWiki.prototype.tiddlerExists = function(title)
{
	var t = this.fetchTiddler(title);
	return t != undefined;
};

TiddlyWiki.prototype.isShadowTiddler = function(title)
{
	return config.shadowTiddlers[title] === undefined ? false : true;
};

TiddlyWiki.prototype.createTiddler = function(title)
{
	var tiddler = this.fetchTiddler(title);
	if(!tiddler) {
		tiddler = new Tiddler(title);
		this.addTiddler(tiddler);
		this.setDirty(true);
	}
	return tiddler;
};

TiddlyWiki.prototype.getTiddler = function(title)
{
	var t = this.fetchTiddler(title);
	if(t != undefined)
		return t;
	else
		return null;
};

TiddlyWiki.prototype.getShadowTiddlerText = function(title)
{
	if(typeof config.shadowTiddlers[title] == "string")
		return config.shadowTiddlers[title];
	else
		return "";
};

TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
{
	if(!title)
		return defaultText;
	var pos = title.indexOf(config.textPrimitives.sectionSeparator);
	var section = null;
	if(pos != -1) {
		section = title.substr(pos + config.textPrimitives.sectionSeparator.length);
		title = title.substr(0,pos);
	}
	pos = title.indexOf(config.textPrimitives.sliceSeparator);
	if(pos != -1) {
		var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length));
		if(slice)
			return slice;
	}
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		if(!section)
			return tiddler.text;
		var re = new RegExp("(^!{1,6}" + section.escapeRegExp() + "[ \t]*\n)","mg");
		re.lastIndex = 0;
		var match = re.exec(tiddler.text);
		if(match) {
			var t = tiddler.text.substr(match.index+match[1].length);
			var re2 = /^!/mg;
			re2.lastIndex = 0;
			match = re2.exec(t); //# search for the next heading
			if(match)
				t = t.substr(0,match.index-1);//# don't include final \n
			return t;
		}
		return defaultText;
	}
	if(this.isShadowTiddler(title))
		return this.getShadowTiddlerText(title);
	if(defaultText != undefined)
		return defaultText;
	return null;
};

TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth)
{
	var bracketRegExp = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])","mg");
	var text = this.getTiddlerText(title,null);
	if(text == null)
		return defaultText;
	var textOut = [];
	var lastPos = 0;
	do {
		var match = bracketRegExp.exec(text);
		if(match) {
			textOut.push(text.substr(lastPos,match.index-lastPos));
			if(match[1]) {
				if(depth <= 0)
					textOut.push(match[1]);
				else
					textOut.push(this.getRecursiveTiddlerText(match[1],"[[" + match[1] + "]]",depth-1));
			}
			lastPos = match.index + match[0].length;
		} else {
			textOut.push(text.substr(lastPos));
		}
	} while(match);
	return textOut.join("");
};

TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]+)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\n]+)[\t\x20]*\|$)/gm;

// @internal
TiddlyWiki.prototype.calcAllSlices = function(title)
{
	var slices = {};
	var text = this.getTiddlerText(title,"");
	this.slicesRE.lastIndex = 0;
	var m = this.slicesRE.exec(text);
	while(m) {
		if(m[2])
			slices[m[2]] = m[3];
		else
			slices[m[5]] = m[6];
		m = this.slicesRE.exec(text);
	}
	return slices;
};

// Returns the slice of text of the given name
TiddlyWiki.prototype.getTiddlerSlice = function(title,sliceName)
{
	var slices = this.slices[title];
	if(!slices) {
		slices = this.calcAllSlices(title);
		this.slices[title] = slices;
	}
	return slices[sliceName];
};

// Build an hashmap of the specified named slices of a tiddler
TiddlyWiki.prototype.getTiddlerSlices = function(title,sliceNames)
{
	var r = {};
	for(var t=0; t<sliceNames.length; t++) {
		var slice = this.getTiddlerSlice(title,sliceNames[t]);
		if(slice)
			r[sliceNames[t]] = slice;
	}
	return r;
};

TiddlyWiki.prototype.suspendNotifications = function()
{
	this.notificationLevel--;
};

TiddlyWiki.prototype.resumeNotifications = function()
{
	this.notificationLevel++;
};

// Invoke the notification handlers for a particular tiddler
TiddlyWiki.prototype.notify = function(title,doBlanket)
{
	if(!this.notificationLevel) {
		for(var t=0; t<this.namedNotifications.length; t++) {
			var n = this.namedNotifications[t];
			if((n.name == null && doBlanket) || (n.name == title))
				n.notify(title);
		}
	}
};

// Invoke the notification handlers for all tiddlers
TiddlyWiki.prototype.notifyAll = function()
{
	if(!this.notificationLevel) {
		for(var t=0; t<this.namedNotifications.length; t++) {
			var n = this.namedNotifications[t];
			if(n.name)
				n.notify(n.name);
		}
	}
};

// Add a notification handler to a tiddler
TiddlyWiki.prototype.addNotification = function(title,fn)
{
	for(var i=0; i<this.namedNotifications.length; i++) {
		if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))
			return this;
	}
	this.namedNotifications.push({name: title, notify: fn});
	return this;
};

TiddlyWiki.prototype.removeTiddler = function(title)
{
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		this.deleteTiddler(title);
		this.notify(title,true);
		this.setDirty(true);
	}
};

// Reset the sync status of a freshly synced tiddler
TiddlyWiki.prototype.resetTiddler = function(title)
{
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		tiddler.clearChangeCount();
		this.notify(title,true);
		this.setDirty(true);
	}
};

TiddlyWiki.prototype.setTiddlerTag = function(title,status,tag)
{
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		var t = tiddler.tags.indexOf(tag);
		if(t != -1)
			tiddler.tags.splice(t,1);
		if(status)
			tiddler.tags.push(tag);
		tiddler.changed();
		tiddler.incChangeCount();
		this.notify(title,true);
		this.setDirty(true);
	}
};

TiddlyWiki.prototype.addTiddlerFields = function(title,fields)
{
	var tiddler = this.fetchTiddler(title);
	if(!tiddler)
		return;
	merge(tiddler.fields,fields);
	tiddler.changed();
	tiddler.incChangeCount();
	this.notify(title,true);
	this.setDirty(true);
};

TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created)
{
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		created = created || tiddler.created; // Preserve created date
		this.deleteTiddler(title);
	} else {
		created = created || modified;
		tiddler = new Tiddler();
	}
	tiddler.set(newTitle,newBody,modifier,modified,tags,created,fields);
	this.addTiddler(tiddler);
	if(clearChangeCount)
		tiddler.clearChangeCount();
	else
		tiddler.incChangeCount();
	if(title != newTitle)
		this.notify(title,true);
	this.notify(newTitle,true);
	this.setDirty(true);
	return tiddler;
};

TiddlyWiki.prototype.incChangeCount = function(title)
{
	var tiddler = this.fetchTiddler(title);
	if(tiddler)
		tiddler.incChangeCount();
};

TiddlyWiki.prototype.getLoader = function()
{
	if(!this.loader)
		this.loader = new TW21Loader();
	return this.loader;
};

TiddlyWiki.prototype.getSaver = function()
{
	if(!this.saver)
		this.saver = new TW21Saver();
	return this.saver;
};

// Return all tiddlers formatted as an HTML string
TiddlyWiki.prototype.allTiddlersAsHtml = function()
{
	return this.getSaver().externalize(store);
};

// Load contents of a TiddlyWiki from an HTML DIV
TiddlyWiki.prototype.loadFromDiv = function(src,idPrefix,noUpdate)
{
	this.idPrefix = idPrefix;
	var storeElem = (typeof src == "string") ? document.getElementById(src) : src;
	if(!storeElem)
		return;
	var tiddlers = this.getLoader().loadTiddlers(this,storeElem.childNodes);
	this.setDirty(false);
	if(!noUpdate) {
		for(var i = 0;i<tiddlers.length; i++)
			tiddlers[i].changed();
	}
};

// Load contents of a TiddlyWiki from a string
// Returns null if there's an error
TiddlyWiki.prototype.importTiddlyWiki = function(text)
{
	var posDiv = locateStoreArea(text);
	if(!posDiv)
		return null;
	var content = "<" + "html><" + "body>" + text.substring(posDiv[0],posDiv[1] + endSaveArea.length) + "<" + "/body><" + "/html>";
	// Create the iframe
	var iframe = document.createElement("iframe");
	iframe.style.display = "none";
	document.body.appendChild(iframe);
	var doc = iframe.document;
	if(iframe.contentDocument)
		doc = iframe.contentDocument; // For NS6
	else if(iframe.contentWindow)
		doc = iframe.contentWindow.document; // For IE5.5 and IE6
	// Put the content in the iframe
	doc.open();
	doc.writeln(content);
	doc.close();
	// Load the content into a TiddlyWiki() object
	var storeArea = doc.getElementById("storeArea");
	this.loadFromDiv(storeArea,"store");
	// Get rid of the iframe
	iframe.parentNode.removeChild(iframe);
	return this;
};

TiddlyWiki.prototype.updateTiddlers = function()
{
	this.tiddlersUpdated = true;
	this.forEachTiddler(function(title,tiddler) {
		tiddler.changed();
	});
};

// Return an array of tiddlers matching a search regular expression
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
{
	var candidates = this.reverseLookup("tags",excludeTag,!!match);
	var results = [];
	for(var t=0; t<candidates.length; t++) {
		if((candidates[t].title.search(searchRegExp) != -1) || (candidates[t].text.search(searchRegExp) != -1))
			results.push(candidates[t]);
	}
	if(!sortField)
		sortField = "title";
	results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
	return results;
};

// Returns a list of all tags in use
//   excludeTag - if present, excludes tags that are themselves tagged with excludeTag
// Returns an array of arrays where [tag][0] is the name of the tag and [tag][1] is the number of occurances
TiddlyWiki.prototype.getTags = function(excludeTag)
{
	var results = [];
	this.forEachTiddler(function(title,tiddler) {
		for(var g=0; g<tiddler.tags.length; g++) {
			var tag = tiddler.tags[g];
			var n = true;
			for(var c=0; c<results.length; c++) {
				if(results[c][0] == tag) {
					n = false;
					results[c][1]++;
				}
			}
			if(n && excludeTag) {
				var t = this.fetchTiddler(tag);
				if(t && t.isTagged(excludeTag))
					n = false;
			}
			if(n)
				results.push([tag,1]);
		}
	});
	results.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
	return results;
};

// Return an array of the tiddlers that are tagged with a given tag
TiddlyWiki.prototype.getTaggedTiddlers = function(tag,sortField)
{
	return this.reverseLookup("tags",tag,true,sortField);
};

// Return an array of the tiddlers that link to a given tiddler
TiddlyWiki.prototype.getReferringTiddlers = function(title,unusedParameter,sortField)
{
	if(!this.tiddlersUpdated)
		this.updateTiddlers();
	return this.reverseLookup("links",title,true,sortField);
};

// Return an array of the tiddlers that do or do not have a specified entry in the specified storage array (ie, "links" or "tags")
// lookupMatch == true to match tiddlers, false to exclude tiddlers
TiddlyWiki.prototype.reverseLookup = function(lookupField,lookupValue,lookupMatch,sortField)
{
	var results = [];
	this.forEachTiddler(function(title,tiddler) {
		var f = !lookupMatch;
		for(var lookup=0; lookup<tiddler[lookupField].length; lookup++) {
			if(tiddler[lookupField][lookup] == lookupValue)
				f = lookupMatch;
		}
		if(f)
			results.push(tiddler);
	});
	if(!sortField)
		sortField = "title";
	results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
	return results;
};

// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag)
{
	var results = [];
	this.forEachTiddler(function(title,tiddler) {
		if(excludeTag == undefined || !tiddler.isTagged(excludeTag))
			results.push(tiddler);
	});
	if(field)
		results.sort(function(a,b) {return a[field] < b[field] ? -1 : (a[field] == b[field] ? 0 : +1);});
	return results;
};

// Return array of names of tiddlers that are referred to but not defined
TiddlyWiki.prototype.getMissingLinks = function(sortField)
{
	if(!this.tiddlersUpdated)
		this.updateTiddlers();
	var results = [];
	this.forEachTiddler(function (title,tiddler) {
		if(tiddler.isTagged("excludeMissing") || tiddler.isTagged("systemConfig"))
			return;
		for(var n=0; n<tiddler.links.length;n++) {
			var link = tiddler.links[n];
			if(this.fetchTiddler(link) == null && !this.isShadowTiddler(link))
				results.pushUnique(link);
		}
	});
	results.sort();
	return results;
};

// Return an array of names of tiddlers that are defined but not referred to
TiddlyWiki.prototype.getOrphans = function()
{
	var results = [];
	this.forEachTiddler(function (title,tiddler) {
		if(this.getReferringTiddlers(title).length == 0 && !tiddler.isTagged("excludeLists"))
			results.push(title);
	});
	results.sort();
	return results;
};

// Return an array of names of all the shadow tiddlers
TiddlyWiki.prototype.getShadowed = function()
{
	var results = [];
	for(var t in config.shadowTiddlers) {
		if(this.isShadowTiddler(t))
			results.push(t);
	}
	results.sort();
	return results;
};

// Return an array of tiddlers that have been touched since they were downloaded or created
TiddlyWiki.prototype.getTouched = function()
{
	var results = [];
	this.forEachTiddler(function(title,tiddler) {
		if(tiddler.isTouched())
			results.push(tiddler);
		});
	results.sort();
	return results;
};

// Resolves a Tiddler reference or tiddler title into a Tiddler object, or null if it doesn't exist
TiddlyWiki.prototype.resolveTiddler = function(tiddler)
{
	var t = (typeof tiddler == 'string') ? this.getTiddler(tiddler) : tiddler;
	return t instanceof Tiddler ? t : null;
};

// Filter a list of tiddlers
TiddlyWiki.prototype.filterTiddlers = function(filter)
{
	var results = [];
	if(filter) {
		var tiddler;
		var re = /([^\s\[\]]+)|(?:\[([ \w]+)\[([^\]]+)\]\])|(?:\[\[([^\]]+)\]\])/mg;
		var match = re.exec(filter);
		while(match) {
			if(match[1] || match[4]) {
				var title = match[1] || match[4];
				tiddler = this.fetchTiddler(title);
				if(tiddler) {
					results.pushUnique(tiddler);
				} else if(this.isShadowTiddler(title)) {
					tiddler = new Tiddler();
					tiddler.set(title,this.getTiddlerText(title));
					results.pushUnique(tiddler);
				} else {
					results.pushUnique(new Tiddler(title));
				}
			} else if(match[2]) {
				switch(match[2]) {
					case "tag":
						var matched = this.getTaggedTiddlers(match[3]);
						for(var m = 0; m < matched.length; m++)
							results.pushUnique(matched[m]);
						break;
					case "sort":
						results = this.sortTiddlers(results,match[3]);
						break;
				}
			}
			match = re.exec(filter);
		}
	}
	return results;
};

// Sort a list of tiddlers
TiddlyWiki.prototype.sortTiddlers = function(tiddlers,field)
{
	var asc = +1;
	switch(field.substr(0,1)) {
	case "-":
		asc = -1;
		// Note: this fall-through is intentional
		/*jsl:fallthru*/
	case "+":
		field = field.substr(1);
		break;
	}
	if(TiddlyWiki.standardFieldAccess[field])
		tiddlers.sort(function(a,b) {return a[field] < b[field] ? -asc : (a[field] == b[field] ? 0 : asc);});
	else
		tiddlers.sort(function(a,b) {return a.fields[field] < b.fields[field] ? -asc : (a.fields[field] == b.fields[field] ? 0 : +asc);});
	return tiddlers;
};

// Returns true if path is a valid field name (path),
// i.e. a sequence of identifiers, separated by '.'
TiddlyWiki.isValidFieldName = function(name)
{
	var match = /[a-zA-Z_]\w*(\.[a-zA-Z_]\w*)*/.exec(name);
	return match && (match[0] == name);
};

// Throws an exception when name is not a valid field name.
TiddlyWiki.checkFieldName = function(name)
{
	if(!TiddlyWiki.isValidFieldName(name))
		throw config.messages.invalidFieldName.format([name]);
};

function StringFieldAccess(n,readOnly)
{
	this.set = readOnly ?
			function(t,v) {if(v != t[n]) throw config.messages.fieldCannotBeChanged.format([n]);} :
			function(t,v) {if(v != t[n]) {t[n] = v; return true;}};
	this.get = function(t) {return t[n];};
}

function DateFieldAccess(n)
{
	this.set = function(t,v) {
		var d = v instanceof Date ? v : Date.convertFromYYYYMMDDHHMM(v);
		if(d != t[n]) {
			t[n] = d; return true;
		}
	};
	this.get = function(t) {return t[n].convertToYYYYMMDDHHMM();};
}

function LinksFieldAccess(n)
{
	this.set = function(t,v) {
		var s = (typeof v == "string") ? v.readBracketedList() : v;
		if(s.toString() != t[n].toString()) {
			t[n] = s; return true;
		}
	};
	this.get = function(t) {return String.encodeTiddlyLinkList(t[n]);};
}

TiddlyWiki.standardFieldAccess = {
	// The set functions return true when setting the data has changed the value.
	"title":    new StringFieldAccess("title",true),
	// Handle the "tiddler" field name as the title
	"tiddler":  new StringFieldAccess("title",true),
	"text":     new StringFieldAccess("text"),
	"modifier": new StringFieldAccess("modifier"),
	"modified": new DateFieldAccess("modified"),
	"created":  new DateFieldAccess("created"),
	"tags":     new LinksFieldAccess("tags")
};

TiddlyWiki.isStandardField = function(name)
{
	return TiddlyWiki.standardFieldAccess[name] != undefined;
};

// Sets the value of the given field of the tiddler to the value.
// Setting an ExtendedField's value to null or undefined removes the field.
// Setting a namespace to undefined removes all fields of that namespace.
// The fieldName is case-insensitive.
// All values will be converted to a string value.
TiddlyWiki.prototype.setValue = function(tiddler,fieldName,value)
{
	TiddlyWiki.checkFieldName(fieldName);
	var t = this.resolveTiddler(tiddler);
	if(!t)
		return;
	fieldName = fieldName.toLowerCase();
	var isRemove = (value === undefined) || (value === null);
	var accessor = TiddlyWiki.standardFieldAccess[fieldName];
	if(accessor) {
		if(isRemove)
			// don't remove StandardFields
			return;
		var h = TiddlyWiki.standardFieldAccess[fieldName];
		if(!h.set(t,value))
			return;
	} else {
		var oldValue = t.fields[fieldName];
		if(isRemove) {
			if(oldValue !== undefined) {
				// deletes a single field
				delete t.fields[fieldName];
			} else {
				// no concrete value is defined for the fieldName
				// so we guess this is a namespace path.
				// delete all fields in a namespace
				var re = new RegExp('^'+fieldName+'\\.');
				var dirty = false;
				for(var n in t.fields) {
					if(n.match(re)) {
						delete t.fields[n];
						dirty = true;
					}
				}
				if(!dirty)
					return;
			}
		} else {
			// the "normal" set case. value is defined (not null/undefined)
			// For convenience provide a nicer conversion Date->String
			value = value instanceof Date ? value.convertToYYYYMMDDHHMMSSMMM() : String(value);
			if(oldValue == value)
				return;
			t.fields[fieldName] = value;
		}
	}
	// When we are here the tiddler/store really was changed.
	this.notify(t.title,true);
	if(!fieldName.match(/^temp\./))
		this.setDirty(true);
};

// Returns the value of the given field of the tiddler.
// The fieldName is case-insensitive.
// Will only return String values (or undefined).
TiddlyWiki.prototype.getValue = function(tiddler,fieldName)
{
	var t = this.resolveTiddler(tiddler);
	if(!t)
		return undefined;
	fieldName = fieldName.toLowerCase();
	var accessor = TiddlyWiki.standardFieldAccess[fieldName];
	if(accessor) {
		return accessor.get(t);
	}
	return t.fields[fieldName];
};

// Calls the callback function for every field in the tiddler.
// When callback function returns a non-false value the iteration stops
// and that value is returned.
// The order of the fields is not defined.
// @param callback a function(tiddler,fieldName,value).
TiddlyWiki.prototype.forEachField = function(tiddler,callback,onlyExtendedFields)
{
	var t = this.resolveTiddler(tiddler);
	if(!t)
		return undefined;
	var n,result;
	for(n in t.fields) {
		result = callback(t,n,t.fields[n]);
		if(result)
			return result;
		}
	if(onlyExtendedFields)
		return undefined;
	for(n in TiddlyWiki.standardFieldAccess) {
		if(n == "tiddler")
			// even though the "title" field can also be referenced through the name "tiddler"
			// we only visit this field once.
			continue;
		result = callback(t,n,TiddlyWiki.standardFieldAccess[n].get(t));
		if(result)
			return result;
	}
	return undefined;
};

//--
//-- Story functions
//--

function Story(containerId,idPrefix)
{
	this.container = containerId;
	this.idPrefix = idPrefix;
	this.highlightRegExp = null;
	this.tiddlerId = function(title) {
		var id = this.idPrefix + title;
		return id==this.container ? this.idPrefix + "_" + title : id;
	};
	this.containerId = function() {
		return this.container;
	};
}

Story.prototype.getTiddler = function(title)
{
	return document.getElementById(this.tiddlerId(title));
};

Story.prototype.getContainer = function()
{
	return document.getElementById(this.containerId());
};

Story.prototype.forEachTiddler = function(fn)
{
	var place = this.getContainer();
	if(!place)
		return;
	var e = place.firstChild;
	while(e) {
		var n = e.nextSibling;
		var title = e.getAttribute("tiddler");
		fn.call(this,title,e);
		e = n;
	}
};

Story.prototype.displayDefaultTiddlers = function()
{
	this.displayTiddlers(null,store.filterTiddlers(store.getTiddlerText("DefaultTiddlers")));
};

Story.prototype.displayTiddlers = function(srcElement,titles,template,animate,unused,customFields,toggle)
{
	for(var t = titles.length-1;t>=0;t--)
		this.displayTiddler(srcElement,titles[t],template,animate,unused,customFields);
};

Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc)
{
	var title = (tiddler instanceof Tiddler) ? tiddler.title : tiddler;
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem) {
		if(toggle)
			this.closeTiddler(title,true);
		else
			this.refreshTiddler(title,template,false,customFields);
	} else {
		var place = this.getContainer();
		var before = this.positionTiddler(srcElement);
		tiddlerElem = this.createTiddler(place,before,title,template,customFields);
	}
	if(animationSrc && typeof animationSrc !== "string") {
		srcElement = animationSrc;
	}
	if(srcElement && typeof srcElement !== "string") {
		if(config.options.chkAnimate && (animate == undefined || animate == true) && anim && typeof Zoomer == "function" && typeof Scroller == "function")
			anim.startAnimating(new Zoomer(title,srcElement,tiddlerElem),new Scroller(tiddlerElem));
		else
			window.scrollTo(0,ensureVisible(tiddlerElem));
	}
};

Story.prototype.positionTiddler = function(srcElement)
{
	var place = this.getContainer();
	var before = null;
	if(typeof srcElement == "string") {
		switch(srcElement) {
		case "top":
			before = place.firstChild;
			break;
		case "bottom":
			before = null;
			break;
		}
	} else {
		var after = this.findContainingTiddler(srcElement);
		if(after == null) {
			before = place.firstChild;
		} else if(after.nextSibling) {
			before = after.nextSibling;
			if(before.nodeType != 1)
				before = null;
		}
	}
	return before;
};

Story.prototype.createTiddler = function(place,before,title,template,customFields)
{
	var tiddlerElem = createTiddlyElement(null,"div",this.tiddlerId(title),"tiddler");
	tiddlerElem.setAttribute("refresh","tiddler");
	if(customFields)
		tiddlerElem.setAttribute("tiddlyFields",customFields);
	place.insertBefore(tiddlerElem,before);
	var defaultText = null;
	if(!store.tiddlerExists(title) && !store.isShadowTiddler(title))
		defaultText = this.loadMissingTiddler(title,customFields,tiddlerElem);
	this.refreshTiddler(title,template,false,customFields,defaultText);
	return tiddlerElem;
};

Story.prototype.loadMissingTiddler = function(title,fields,tiddlerElem)
{
	var tiddler = new Tiddler(title);
	tiddler.fields = typeof fields == "string" ? fields.decodeHashMap() : (fields || {});
	var serverType = tiddler.getServerType();
	var host = tiddler.fields['server.host'];
	var workspace = tiddler.fields['server.workspace'];
	if(!serverType || !host)
		return null;
	var sm = new SyncMachine(serverType,{
			start: function() {
				return this.openHost(host,"openWorkspace");
			},
			openWorkspace: function() {
				return this.openWorkspace(workspace,"getTiddler");
			},
			getTiddler: function() {
				return this.getTiddler(title,"onGetTiddler");
			},
			onGetTiddler: function(context) {
				var tiddler = context.tiddler;
				if(tiddler && tiddler.text) {
					var downloaded = new Date();
					if(!tiddler.created)
						tiddler.created = downloaded;
					if(!tiddler.modified)
						tiddler.modified = tiddler.created;
					store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields,true,tiddler.created);
					autoSaveChanges();
				}
				delete this;
				return true;
			},
			error: function(message) {
				displayMessage("Error loading missing tiddler from %0: %1".format([host,message]));
			}
		});
	sm.go();
	return config.messages.loadingMissingTiddler.format([title,serverType,host,workspace]);
};

Story.prototype.chooseTemplateForTiddler = function(title,template)
{
	if(!template)
		template = DEFAULT_VIEW_TEMPLATE;
	if(template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE)
		template = config.tiddlerTemplates[template];
	return template;
};

Story.prototype.getTemplateForTiddler = function(title,template,tiddler)
{
	return store.getRecursiveTiddlerText(template,null,10);
};

Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText)
{
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem) {
		if(tiddlerElem.getAttribute("dirty") == "true" && !force)
			return tiddlerElem;
		template = this.chooseTemplateForTiddler(title,template);
		var currTemplate = tiddlerElem.getAttribute("template");
		if((template != currTemplate) || force) {
			var tiddler = store.getTiddler(title);
			if(!tiddler) {
				tiddler = new Tiddler();
				if(store.isShadowTiddler(title)) {
					var tags = [];
					tiddler.set(title,store.getTiddlerText(title),config.views.wikified.shadowModifier,version.date,tags,version.date);
				} else {
					var text = template=="EditTemplate" ?
								config.views.editor.defaultText.format([title]) :
								config.views.wikified.defaultText.format([title]);
					text = defaultText || text;
					var fields = customFields ? customFields.decodeHashMap() : null;
					tiddler.set(title,text,config.views.wikified.defaultModifier,version.date,[],version.date,fields);
				}
			}
			tiddlerElem.setAttribute("tags",tiddler.tags.join(" "));
			tiddlerElem.setAttribute("tiddler",title);
			tiddlerElem.setAttribute("template",template);
			tiddlerElem.onmouseover = this.onTiddlerMouseOver;
			tiddlerElem.onmouseout = this.onTiddlerMouseOut;
			tiddlerElem.ondblclick = this.onTiddlerDblClick;
			tiddlerElem[window.event?"onkeydown":"onkeypress"] = this.onTiddlerKeyPress;
			tiddlerElem.innerHTML = this.getTemplateForTiddler(title,template,tiddler);
			applyHtmlMacros(tiddlerElem,tiddler);
			if(store.getTaggedTiddlers(title).length > 0)
				addClass(tiddlerElem,"isTag");
			else
				removeClass(tiddlerElem,"isTag");
			if(store.tiddlerExists(title)) {
				removeClass(tiddlerElem,"shadow");
				removeClass(tiddlerElem,"missing");
			} else {
				addClass(tiddlerElem,store.isShadowTiddler(title) ? "shadow" : "missing");
			}
			if(customFields)
				this.addCustomFields(tiddlerElem,customFields);
			forceReflow();
		}
	}
	return tiddlerElem;
};

Story.prototype.addCustomFields = function(place,customFields)
{
	var fields = customFields.decodeHashMap();
	var w = document.createElement("div");
	w.style.display = "none";
	place.appendChild(w);
	for(var t in fields) {
		var e = document.createElement("input");
		e.setAttribute("type","text");
		e.setAttribute("value",fields[t]);
		w.appendChild(e);
		e.setAttribute("edit",t);
	}
};

Story.prototype.refreshAllTiddlers = function(force)
{
	var e = this.getContainer().firstChild;
	while(e) {
		var template = e.getAttribute("template");
		if(template && e.getAttribute("dirty") != "true") {
			this.refreshTiddler(e.getAttribute("tiddler"),force ? null : template,true);
		}
		e = e.nextSibling;
	}
};

Story.prototype.onTiddlerMouseOver = function(e)
{
	if(window.addClass instanceof Function)
		addClass(this,"selected");
};

Story.prototype.onTiddlerMouseOut = function(e)
{
	if(window.removeClass instanceof Function)
		removeClass(this,"selected");
};

Story.prototype.onTiddlerDblClick = function(ev)
{
	var e = ev || window.event;
	var target = resolveTarget(e);
	if(target && target.nodeName.toLowerCase() != "input" && target.nodeName.toLowerCase() != "textarea") {
		if(document.selection && document.selection.empty)
			document.selection.empty();
		config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
		e.cancelBubble = true;
		if(e.stopPropagation) e.stopPropagation();
		return true;
	}
	return false;
};

Story.prototype.onTiddlerKeyPress = function(ev)
{
	var e = ev || window.event;
	clearMessage();
	var consume = false;
	var title = this.getAttribute("tiddler");
	var target = resolveTarget(e);
	switch(e.keyCode) {
	case 9: // Tab
		if(config.options.chkInsertTabs && target.tagName.toLowerCase() == "textarea") {
			replaceSelection(target,String.fromCharCode(9));
			consume = true;
		}
		if(config.isOpera) {
			target.onblur = function() {
				this.focus();
				this.onblur = null;
			};
		}
		break;
	case 13: // Ctrl-Enter
	case 10: // Ctrl-Enter on IE PC
	case 77: // Ctrl-Enter is "M" on some platforms
		if(e.ctrlKey) {
			blurElement(this);
			config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
			consume = true;
		}
		break;
	case 27: // Escape
		blurElement(this);
		config.macros.toolbar.invokeCommand(this,"cancelCommand",e);
		consume = true;
		break;
	}
	e.cancelBubble = consume;
	if(consume) {
		if(e.stopPropagation) e.stopPropagation(); // Stop Propagation
		e.returnValue = true; // Cancel The Event in IE
		if(e.preventDefault ) e.preventDefault(); // Cancel The Event in Moz
	}
	return !consume;
};

Story.prototype.getTiddlerField = function(title,field)
{
	var tiddlerElem = this.getTiddler(title);
	var e = null;
	if(tiddlerElem ) {
		var children = tiddlerElem.getElementsByTagName("*");
		for(var t=0; t<children.length; t++) {
			var c = children[t];
			if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea") {
				if(!e)
					e = c;
				if(c.getAttribute("edit") == field)
					e = c;
			}
		}
	}
	return e;
};

Story.prototype.focusTiddler = function(title,field)
{
	var e = this.getTiddlerField(title,field);
	if(e) {
		e.focus();
		e.select();
	}
};

Story.prototype.blurTiddler = function(title)
{
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem && tiddlerElem.focus && tiddlerElem.blur) {
		tiddlerElem.focus();
		tiddlerElem.blur();
	}
};

Story.prototype.setTiddlerField = function(title,tag,mode,field)
{
	var c = this.getTiddlerField(title,field);
	var tags = c.value.readBracketedList();
	tags.setItem(tag,mode);
	c.value = String.encodeTiddlyLinkList(tags);
};

Story.prototype.setTiddlerTag = function(title,tag,mode)
{
	this.setTiddlerField(title,tag,mode,"tags");
};

Story.prototype.closeTiddler = function(title,animate,unused)
{
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem) {
		clearMessage();
		this.scrubTiddler(tiddlerElem);
		if(config.options.chkAnimate && animate && anim && typeof Slider == "function")
			anim.startAnimating(new Slider(tiddlerElem,false,null,"all"));
		else {
			removeNode(tiddlerElem);
			forceReflow();
		}
	}
};

Story.prototype.scrubTiddler = function(tiddlerElem)
{
	tiddlerElem.id = null;
};

Story.prototype.setDirty = function(title,dirty)
{
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem)
		tiddlerElem.setAttribute("dirty",dirty ? "true" : "false");
};

Story.prototype.isDirty = function(title)
{
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem)
		return tiddlerElem.getAttribute("dirty") == "true";
	return null;
};

Story.prototype.areAnyDirty = function()
{
	var r = false;
	this.forEachTiddler(function(title,element) {
		if(this.isDirty(title))
			r = true;
	});
	return r;
};

Story.prototype.closeAllTiddlers = function(exclude)
{
	clearMessage();
	this.forEachTiddler(function(title,element) {
		if((title != exclude) && element.getAttribute("dirty") != "true")
			this.closeTiddler(title);
	});
	window.scrollTo(0,ensureVisible(this.container));
};

Story.prototype.isEmpty = function()
{
	var place = this.getContainer();
	return place && place.firstChild == null;
};

Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	this.closeAllTiddlers();
	highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	var matches = store.search(highlightHack,"title","excludeSearch");
	this.displayTiddlers(null,matches);
	highlightHack = null;
	var q = useRegExp ? "/" : "'";
	if(matches.length > 0)
		displayMessage(config.macros.search.successMsg.format([matches.length.toString(),q + text + q]));
	else
		displayMessage(config.macros.search.failureMsg.format([q + text + q]));
};

Story.prototype.findContainingTiddler = function(e)
{
	while(e && !hasClass(e,"tiddler"))
		e = e.parentNode;
	return e;
};

Story.prototype.gatherSaveFields = function(e,fields)
{
	if(e && e.getAttribute) {
		var f = e.getAttribute("edit");
		if(f)
			fields[f] = e.value.replace(/\r/mg,"");
		if(e.hasChildNodes()) {
			var c = e.childNodes;
			for(var t=0; t<c.length; t++)
				this.gatherSaveFields(c[t],fields);
		}
	}
};

Story.prototype.hasChanges = function(title)
{
	var e = this.getTiddler(title);
	if(e) {
		var fields = {};
		this.gatherSaveFields(e,fields);
		var tiddler = store.fetchTiddler(title);
		if(!tiddler)
			return false;
		for(var n in fields) {
			if(store.getValue(title,n) != fields[n])
				return true;
		}
	}
	return false;
};

Story.prototype.saveTiddler = function(title,minorUpdate)
{
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem) {
		var fields = {};
		this.gatherSaveFields(tiddlerElem,fields);
		var newTitle = fields.title || title;
		if(!store.tiddlerExists(newTitle))
			newTitle = newTitle.trim();
		if(store.tiddlerExists(newTitle) && newTitle != title) {
			if(!confirm(config.messages.overwriteWarning.format([newTitle.toString()])))
				return null;
		}
		if(newTitle != title)
			this.closeTiddler(newTitle,false);
		tiddlerElem.id = this.tiddlerId(newTitle);
		tiddlerElem.setAttribute("tiddler",newTitle);
		tiddlerElem.setAttribute("template",DEFAULT_VIEW_TEMPLATE);
		tiddlerElem.setAttribute("dirty","false");
		if(config.options.chkForceMinorUpdate)
			minorUpdate = !minorUpdate;
		if(!store.tiddlerExists(newTitle))
			minorUpdate = false;
		var newDate = new Date();
		var extendedFields = store.tiddlerExists(newTitle) ? store.fetchTiddler(newTitle).fields : (newTitle!=title && store.tiddlerExists(title) ? store.fetchTiddler(title).fields : merge({},config.defaultCustomFields));
		for(var n in fields) {
			if(!TiddlyWiki.isStandardField(n))
				extendedFields[n] = fields[n];
		}
		var tiddler = store.saveTiddler(title,newTitle,fields.text,minorUpdate ? undefined : config.options.txtUserName,minorUpdate ? undefined : newDate,fields.tags,extendedFields);
		autoSaveChanges(null,[tiddler]);
		return newTitle;
	}
	return null;
};

Story.prototype.permaView = function()
{
	var links = [];
	this.forEachTiddler(function(title,element) {
		links.push(String.encodeTiddlyLink(title));
	});
	var t = encodeURIComponent(links.join(" "));
	if(t == "")
		t = "#";
	if(window.location.hash != t)
		window.location.hash = t;
};

Story.prototype.switchTheme = function(theme)
{
	if(safeMode)
		return;

	var isAvailable = function(title) {
		var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1;
		if(s!=-1)
			title = title.substr(0,s);
		return store.tiddlerExists(title) || store.isShadowTiddler(title);
	};

	var getSlice = function(theme,slice) {
		var r;
		if(readOnly)
			r = store.getTiddlerSlice(theme,slice+"ReadOnly") || store.getTiddlerSlice(theme,"Web"+slice);
		r = r || store.getTiddlerSlice(theme,slice);
		if(r && r.indexOf(config.textPrimitives.sectionSeparator)==0)
			r = theme + r;
		return isAvailable(r) ? r : slice;
	};

	var replaceNotification = function(i,name,theme,slice) {
		var newName = getSlice(theme,slice);
		if(name!=newName && store.namedNotifications[i].name==name) {
			store.namedNotifications[i].name = newName;
			return newName;
		}
		return name;
	};

	var pt = config.refresherData.pageTemplate;
	var vi = DEFAULT_VIEW_TEMPLATE;
	var vt = config.tiddlerTemplates[vi];
	var ei = DEFAULT_EDIT_TEMPLATE;
	var et = config.tiddlerTemplates[ei];

	for(var i=0; i<config.notifyTiddlers.length; i++) {
		var name = config.notifyTiddlers[i].name;
		switch(name) {
		case "PageTemplate":
			config.refresherData.pageTemplate = replaceNotification(i,config.refresherData.pageTemplate,theme,name);
			break;
		case "StyleSheet":
			removeStyleSheet(config.refresherData.styleSheet);
			config.refresherData.styleSheet = replaceNotification(i,config.refresherData.styleSheet,theme,name);
			break;
		case "ColorPalette":
			config.refresherData.colorPalette = replaceNotification(i,config.refresherData.colorPalette,theme,name);
			break;
		default:
			break;
		}
	}
	config.tiddlerTemplates[vi] = getSlice(theme,"ViewTemplate");
	config.tiddlerTemplates[ei] = getSlice(theme,"EditTemplate");
	if(!startingUp) {
		if(config.refresherData.pageTemplate!=pt || config.tiddlerTemplates[vi]!=vt || config.tiddlerTemplates[ei]!=et) {
			refreshAll();
			this.refreshAllTiddlers(true);
		} else {
			setStylesheet(store.getRecursiveTiddlerText(config.refresherData.styleSheet,"",10),config.refreshers.styleSheet);
		}
		config.options.txtTheme = theme;
		saveOptionCookie("txtTheme");
	}
};

//--
//-- Backstage
//--

var backstage = {
	area: null,
	toolbar: null,
	button: null,
	showButton: null,
	hideButton: null,
	cloak: null,
	panel: null,
	panelBody: null,
	panelFooter: null,
	currTabName: null,
	currTabElem: null,
	content: null,

	init: function() {
		var cmb = config.messages.backstage;
		this.area = document.getElementById("backstageArea");
		this.toolbar = document.getElementById("backstageToolbar");
		this.button = document.getElementById("backstageButton");
		this.button.style.display = "block";
		var t = cmb.open.text + " " + glyph("bentArrowLeft");
		this.showButton = createTiddlyButton(this.button,t,cmb.open.tooltip,
						function(e) {backstage.show(); return false;},null,"backstageShow");
		t = glyph("bentArrowRight") + " " + cmb.close.text;
		this.hideButton = createTiddlyButton(this.button,t,cmb.close.tooltip,
						function(e) {backstage.hide(); return false;},null,"backstageHide");
		this.cloak = document.getElementById("backstageCloak");
		this.panel = document.getElementById("backstagePanel");
		this.panelFooter = createTiddlyElement(this.panel,"div",null,"backstagePanelFooter");
		this.panelBody = createTiddlyElement(this.panel,"div",null,"backstagePanelBody");
		this.cloak.onmousedown = function(e) {backstage.switchTab(null);};
		createTiddlyText(this.toolbar,cmb.prompt);
		for(t=0; t<config.backstageTasks.length; t++) {
			var taskName = config.backstageTasks[t];
			var task = config.tasks[taskName];
			var handler = task.action ? this.onClickCommand : this.onClickTab;
			var text = task.text + (task.action ? "" : glyph("downTriangle"));
			var btn = createTiddlyButton(this.toolbar,text,task.tooltip,handler,"backstageTab");
			btn.setAttribute("task",taskName);
			addClass(btn,task.action ? "backstageAction" : "backstageTask");
			}
		this.content = document.getElementById("contentWrapper");
		if(config.options.chkBackstage)
			this.show();
		else
			this.hide();
	},

	isVisible: function() {
		return this.area ? this.area.style.display == "block" : false;
	},

	show: function() {
		this.area.style.display = "block";
		if(anim && config.options.chkAnimate) {
			backstage.toolbar.style.left = findWindowWidth() + "px";
			var p = [{style: "left", start: findWindowWidth(), end: 0, template: "%0px"}];
			anim.startAnimating(new Morpher(backstage.toolbar,config.animDuration,p));
		} else {
			backstage.area.style.left = "0px";
		}
		this.showButton.style.display = "none";
		this.hideButton.style.display = "block";
		config.options.chkBackstage = true;
		saveOptionCookie("chkBackstage");
		addClass(this.content,"backstageVisible");
	},

	hide: function() {
		if(this.currTabElem) {
			this.switchTab(null);
		} else {
			backstage.toolbar.style.left = "0px";
			if(anim && config.options.chkAnimate) {
				var p = [{style: "left", start: 0, end: findWindowWidth(), template: "%0px"}];
				var c = function(element,properties) {backstage.area.style.display = "none";};
				anim.startAnimating(new Morpher(backstage.toolbar,config.animDuration,p,c));
			} else {
				this.area.style.display = "none";
			}
			this.showButton.style.display = "block";
			this.hideButton.style.display = "none";
			config.options.chkBackstage = false;
			saveOptionCookie("chkBackstage");
			removeClass(this.content,"backstageVisible");
		}
	},

	onClickCommand: function(e) {
		var task = config.tasks[this.getAttribute("task")];
		displayMessage(task);
		if(task.action) {
			backstage.switchTab(null);
			task.action();
		}
		return false;
	},

	onClickTab: function(e) {
		backstage.switchTab(this.getAttribute("task"));
		return false;
	},

	// Switch to a given tab, or none if null is passed
	switchTab: function(tabName) {
		var tabElem = null;
		var e = this.toolbar.firstChild;
		while(e)
			{
			if(e.getAttribute && e.getAttribute("task") == tabName)
				tabElem = e;
			e = e.nextSibling;
			}
		if(tabName == backstage.currTabName)
			return;
		if(backstage.currTabElem) {
			removeClass(this.currTabElem,"backstageSelTab");
		}
		if(tabElem && tabName) {
			backstage.preparePanel();
			addClass(tabElem,"backstageSelTab");
			var task = config.tasks[tabName];
			wikify(task.content,backstage.panelBody,null,null);
			backstage.showPanel();
		} else if(backstage.currTabElem) {
			backstage.hidePanel();
		}
		backstage.currTabName = tabName;
		backstage.currTabElem = tabElem;
	},

	isPanelVisible: function() {
		return backstage.panel ? backstage.panel.style.display == "block" : false;
	},

	preparePanel: function() {
		backstage.cloak.style.height = findWindowHeight() + "px";
		backstage.cloak.style.display = "block";
		removeChildren(backstage.panelBody);
		return backstage.panelBody;
	},

	showPanel: function() {
		backstage.panel.style.display = "block";
		if(anim && config.options.chkAnimate) {
			backstage.panel.style.top = (-backstage.panel.offsetHeight) + "px";
			var p = [{style: "top", start: -backstage.panel.offsetHeight, end: 0, template: "%0px"}];
			anim.startAnimating(new Morpher(backstage.panel,config.animDuration,p),new Scroller(backstage.panel,false));
		} else {
			backstage.panel.style.top = "0px";
		}
		return backstage.panelBody;
	},

	hidePanel: function() {
		if(backstage.currTabElem)
			removeClass(backstage.currTabElem,"backstageSelTab");
		backstage.currTabElem = null;
		backstage.currTabName = null;
		if(anim && config.options.chkAnimate) {
			var p = [
				{style: "top", start: 0, end: -(backstage.panel.offsetHeight), template: "%0px"},
				{style: "display", atEnd: "none"}
			];
			var c = function(element,properties) {backstage.cloak.style.display = "none";};
			anim.startAnimating(new Morpher(backstage.panel,config.animDuration,p,c));
		 } else {
			backstage.panel.style.display = "none";
			backstage.cloak.style.display = "none";
		}
	}
};

config.macros.backstage = {};

config.macros.backstage.handler = function(place,macroName,params)
{
	var backstageTask = config.tasks[params[0]];
	if(backstageTask)
		createTiddlyButton(place,backstageTask.text,backstageTask.tooltip,function(e) {backstage.switchTab(params[0]); return false;});
};

//--
//-- ImportTiddlers macro
//--

config.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	if(readOnly) {
		createTiddlyElement(place,"div",null,"marked",this.readOnlyWarning);
		return;
	}
	var w = new Wizard();
	w.createWizard(place,this.wizardTitle);
	this.restart(w);
};

config.macros.importTiddlers.onCancel = function(e)
{
	var wizard = new Wizard(this);
	var place = wizard.clear();
	config.macros.importTiddlers.restart(wizard);
	return false;
};

config.macros.importTiddlers.onClose = function(e)
{
	backstage.hidePanel();
	return false;
};

config.macros.importTiddlers.restart = function(wizard)
{
	wizard.addStep(this.step1Title,this.step1Html);
	var s = wizard.getElement("selTypes");
	for(var t in config.adaptors) {
		var e = createTiddlyElement(s,"option",null,null,config.adaptors[t].serverLabel ? config.adaptors[t].serverLabel : t);
		e.value = t;
	}
	if(config.defaultAdaptor)
		s.value = config.defaultAdaptor;
	s = wizard.getElement("selFeeds");
	var feeds = this.getFeeds();
	for(t in feeds) {
		e = createTiddlyElement(s,"option",null,null,t);
		e.value = t;
	}
	wizard.setValue("feeds",feeds);
	s.onchange = config.macros.importTiddlers.onFeedChange;
	var fileInput = wizard.getElement("txtBrowse");
	fileInput.onchange = config.macros.importTiddlers.onBrowseChange;
	fileInput.onkeyup = config.macros.importTiddlers.onBrowseChange;
	wizard.setButtons([{caption: this.openLabel, tooltip: this.openPrompt, onClick: config.macros.importTiddlers.onOpen}]);
	wizard.formElem.action = "javascript:;";
	wizard.formElem.onsubmit = function() {
		if(this.txtPath.value.length)
			this.lastChild.firstChild.onclick();
	};
};

config.macros.importTiddlers.getFeeds = function()
{
	var feeds = {};
	var tagged = store.getTaggedTiddlers("systemServer","title");
	for(var t=0; t<tagged.length; t++) {
		var title = tagged[t].title;
		var serverType = store.getTiddlerSlice(title,"Type");
		if(!serverType)
			serverType = "file";
		feeds[title] = {title: title,
						url: store.getTiddlerSlice(title,"URL"),
						workspace: store.getTiddlerSlice(title,"Workspace"),
						workspaceList: store.getTiddlerSlice(title,"WorkspaceList"),
						tiddlerFilter: store.getTiddlerSlice(title,"TiddlerFilter"),
						serverType: serverType,
						description: store.getTiddlerSlice(title,"Description")};
	}
	return feeds;
};

config.macros.importTiddlers.onFeedChange = function(e)
{
	var wizard = new Wizard(this);
	var selTypes = wizard.getElement("selTypes");
	var fileInput = wizard.getElement("txtPath");
	var feeds = wizard.getValue("feeds");
	var f = feeds[this.value];
	if(f) {
		selTypes.value = f.serverType;
		fileInput.value = f.url;
		wizard.setValue("feedName",f.serverType);
		wizard.setValue("feedHost",f.url);
		wizard.setValue("feedWorkspace",f.workspace);
		wizard.setValue("feedWorkspaceList",f.workspaceList);
		wizard.setValue("feedTiddlerFilter",f.tiddlerFilter);
	}
	return false;
};

config.macros.importTiddlers.onBrowseChange = function(e)
{
	var wizard = new Wizard(this);
	var fileInput = wizard.getElement("txtPath");
	fileInput.value = config.macros.importTiddlers.getURLFromLocalPath(this.value);
	var serverType = wizard.getElement("selTypes");
	serverType.value = "file";
	return true;
};

config.macros.importTiddlers.getURLFromLocalPath = function(v)
{
	if(!v||!v.length)
		return v;
	v = v.replace(/\\/g,"/"); // use "/" for cross-platform consistency
	var u;
	var t = v.split(":");
	var p = t[1]||t[0]; // remove drive letter (if any)
	if (t[1] && (t[0]=="http"||t[0]=="https"||t[0]=="file")) {
		u = v;
	} else if(p.substr(0,1)=="/") {
		u = document.location.protocol + "//" + document.location.hostname + (t[1] ? "/" : "") + v;
	} else {
		var c = document.location.href.replace(/\\/g,"/");
		var pos = c.lastIndexOf("/");
		if (pos!=-1)
			c = c.substr(0,pos); // remove filename
		u = c + "/" + p;
	}
	return u;
};

config.macros.importTiddlers.onOpen = function(e)
{
	var wizard = new Wizard(this);
	var fileInput = wizard.getElement("txtPath");
	var url = fileInput.value;
	var serverType = wizard.getElement("selTypes").value || config.defaultAdaptor;
	var adaptor = new config.adaptors[serverType]();
	wizard.setValue("adaptor",adaptor);
	wizard.setValue("serverType",serverType);
	wizard.setValue("host",url);
	var ret = adaptor.openHost(url,null,wizard,config.macros.importTiddlers.onOpenHost);
	if(ret !== true)
		displayMessage(ret);
	wizard.setButtons([{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}],config.macros.importTiddlers.statusOpenHost);
	return false;
};

config.macros.importTiddlers.onOpenHost = function(context,wizard)
{
	var adaptor = wizard.getValue("adaptor");
	if(context.status !== true)
		displayMessage("Error in importTiddlers.onOpenHost: " + context.statusText);
	var ret = adaptor.getWorkspaceList(context,wizard,config.macros.importTiddlers.onGetWorkspaceList);
	if(ret !== true)
		displayMessage(ret);
	wizard.setButtons([{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}],config.macros.importTiddlers.statusGetWorkspaceList);
};

config.macros.importTiddlers.onGetWorkspaceList = function(context,wizard)
{
	if(context.status !== true)
		displayMessage("Error in importTiddlers.onGetWorkspaceList: " + context.statusText);
	wizard.setValue("context",context);
	var workspace = wizard.getValue("feedWorkspace");
	if(!workspace && context.workspaces.length==1)
		workspace = context.workspaces[0].title;
	if(workspace) {
		var ret = context.adaptor.openWorkspace(workspace,context,wizard,config.macros.importTiddlers.onOpenWorkspace);
		if(ret !== true)
			displayMessage(ret);
		wizard.setValue("workspace",workspace);
		wizard.setButtons([{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}],config.macros.importTiddlers.statusOpenWorkspace);
		return;
	}
	wizard.addStep(config.macros.importTiddlers.step2Title,config.macros.importTiddlers.step2Html);
	var s = wizard.getElement("selWorkspace");
	s.onchange = config.macros.importTiddlers.onWorkspaceChange;
	for(var t=0; t<context.workspaces.length; t++) {
		var e = createTiddlyElement(s,"option",null,null,context.workspaces[t].title);
		e.value = context.workspaces[t].title;
	}
	var workspaceList = wizard.getValue("feedWorkspaceList");
	if(workspaceList) {
		var list = workspaceList.parseParams("workspace",null,false,true);
		for(var n=1; n<list.length; n++) {
			if(context.workspaces.findByField("title",list[n].value) == null) {
				e = createTiddlyElement(s,"option",null,null,list[n].value);
				e.value = list[n].value;
			}
		}
	}
	if(workspace) {
		t = wizard.getElement("txtWorkspace");
		t.value = workspace;
	}
	wizard.setButtons([{caption: config.macros.importTiddlers.openLabel, tooltip: config.macros.importTiddlers.openPrompt, onClick: config.macros.importTiddlers.onChooseWorkspace}]);
};

config.macros.importTiddlers.onWorkspaceChange = function(e)
{
	var wizard = new Wizard(this);
	var t = wizard.getElement("txtWorkspace");
	t.value = this.value;
	this.selectedIndex = 0;
	return false;
};

config.macros.importTiddlers.onChooseWorkspace = function(e)
{
	var wizard = new Wizard(this);
	var adaptor = wizard.getValue("adaptor");
	var workspace = wizard.getElement("txtWorkspace").value;
	wizard.setValue("workspace",workspace);
	var context = wizard.getValue("context");
	var ret = adaptor.openWorkspace(workspace,context,wizard,config.macros.importTiddlers.onOpenWorkspace);
	if(ret !== true)
		displayMessage(ret);
	wizard.setButtons([{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}],config.macros.importTiddlers.statusOpenWorkspace);
	return false;
};

config.macros.importTiddlers.onOpenWorkspace = function(context,wizard)
{
	if(context.status !== true)
		displayMessage("Error in importTiddlers.onOpenWorkspace: " + context.statusText);
	var adaptor = wizard.getValue("adaptor");
	var ret = adaptor.getTiddlerList(context,wizard,config.macros.importTiddlers.onGetTiddlerList,wizard.getValue("feedTiddlerFilter"));
	if(ret !== true)
		displayMessage(ret);
	wizard.setButtons([{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}],config.macros.importTiddlers.statusGetTiddlerList);
};

config.macros.importTiddlers.onGetTiddlerList = function(context,wizard)
{
	if(context.status !== true) {
		wizard.setButtons([{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}],config.macros.importTiddlers.errorGettingTiddlerList);
		return;
	}
	// Extract data for the listview
	var listedTiddlers = [];
	if(context.tiddlers) {
		for(var n=0; n<context.tiddlers.length; n++) {
			var tiddler = context.tiddlers[n];
			listedTiddlers.push({
				title: tiddler.title,
				modified: tiddler.modified,
				modifier: tiddler.modifier,
				text: tiddler.text ? wikifyPlainText(tiddler.text,100) : "",
				tags: tiddler.tags,
				size: tiddler.text ? tiddler.text.length : 0,
				tiddler: tiddler
			});
		}
	}
	listedTiddlers.sort(function(a,b) {return a.title < b.title ? -1 : (a.title == b.title ? 0 : +1);});
	// Display the listview
	wizard.addStep(config.macros.importTiddlers.step3Title,config.macros.importTiddlers.step3Html);
	var markList = wizard.getElement("markList");
	var listWrapper = document.createElement("div");
	markList.parentNode.insertBefore(listWrapper,markList);
	var listView = ListView.create(listWrapper,listedTiddlers,config.macros.importTiddlers.listViewTemplate);
	wizard.setValue("listView",listView);
	wizard.setValue("context",context);
	var txtSaveTiddler = wizard.getElement("txtSaveTiddler");
	txtSaveTiddler.value = config.macros.importTiddlers.generateSystemServerName(wizard);
	wizard.setButtons([
			{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel},
			{caption: config.macros.importTiddlers.importLabel, tooltip: config.macros.importTiddlers.importPrompt, onClick: config.macros.importTiddlers.doImport}
		]);
};

config.macros.importTiddlers.generateSystemServerName = function(wizard)
{
	var serverType = wizard.getValue("serverType");
	var host = wizard.getValue("host");
	var workspace = wizard.getValue("workspace");
	var pattern = config.macros.importTiddlers[workspace ? "systemServerNamePattern" : "systemServerNamePatternNoWorkspace"];
	return pattern.format([serverType,host,workspace]);
};

config.macros.importTiddlers.saveServerTiddler = function(wizard)
{
	var txtSaveTiddler = wizard.getElement("txtSaveTiddler").value;
	if(store.tiddlerExists(txtSaveTiddler)) {
		if(!confirm(config.macros.importTiddlers.confirmOverwriteSaveTiddler.format([txtSaveTiddler])))
			return;
		store.suspendNotifications();
		store.removeTiddler(txtSaveTiddler);
		store.resumeNotifications();
	}
	var serverType = wizard.getValue("serverType");
	var host = wizard.getValue("host");
	var workspace = wizard.getValue("workspace");
	var text = config.macros.importTiddlers.serverSaveTemplate.format([serverType,host,workspace]);
	store.saveTiddler(txtSaveTiddler,txtSaveTiddler,text,config.macros.importTiddlers.serverSaveModifier,new Date(),["systemServer"]);
};

config.macros.importTiddlers.doImport = function(e)
{
	var wizard = new Wizard(this);
	if(wizard.getElement("chkSave").checked)
		config.macros.importTiddlers.saveServerTiddler(wizard);
	var chkSync = wizard.getElement("chkSync").checked;
	wizard.setValue("sync",chkSync);
	var listView = wizard.getValue("listView");
	var rowNames = ListView.getSelectedRows(listView);
	var adaptor = wizard.getValue("adaptor");
	var overwrite = [];
	var t;
	for(t=0; t<rowNames.length; t++) {
		if(store.tiddlerExists(rowNames[t]))
			overwrite.push(rowNames[t]);
	}
	if(overwrite.length > 0) {
		if(!confirm(config.macros.importTiddlers.confirmOverwriteText.format([overwrite.join(", ")])))
			return false;
	}
	wizard.addStep(config.macros.importTiddlers.step4Title.format([rowNames.length]),config.macros.importTiddlers.step4Html);
	for(t=0; t<rowNames.length; t++) {
		var link = document.createElement("div");
		createTiddlyLink(link,rowNames[t],true);
		var place = wizard.getElement("markReport");
		place.parentNode.insertBefore(link,place);
	}
	wizard.setValue("remainingImports",rowNames.length);
	wizard.setButtons([
			{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}
		],config.macros.importTiddlers.statusDoingImport);
	var wizardContext = wizard.getValue("context");
	var tiddlers = wizardContext ? wizardContext.tiddlers : [];
	for(t=0; t<rowNames.length; t++) {
		var context = {
			allowSynchronous:true,
			tiddler:tiddlers[tiddlers.findByField("title",rowNames[t])]
		};
		adaptor.getTiddler(rowNames[t],context,wizard,config.macros.importTiddlers.onGetTiddler);
	}
	return false;
};

config.macros.importTiddlers.onGetTiddler = function(context,wizard)
{
	if(!context.status)
		displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
	var tiddler = context.tiddler;
	store.suspendNotifications();
	store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, true, tiddler.created);
	if(!wizard.getValue("sync")) {
		store.setValue(tiddler.title,'server',null);
	}
	store.resumeNotifications();
	if(!context.isSynchronous)
		store.notify(tiddler.title,true);
	var remainingImports = wizard.getValue("remainingImports")-1;
	wizard.setValue("remainingImports",remainingImports);
	if(remainingImports == 0) {
		if(context.isSynchronous) {
			store.notifyAll();
			refreshDisplay();
		}
		wizard.setButtons([
				{caption: config.macros.importTiddlers.doneLabel, tooltip: config.macros.importTiddlers.donePrompt, onClick: config.macros.importTiddlers.onClose}
			],config.macros.importTiddlers.statusDoneImport);
		autoSaveChanges();
	}
};

//--
//-- Upgrade macro
//--

config.macros.upgrade.handler = function(place)
{
	var w = new Wizard();
	w.createWizard(place,this.wizardTitle);
	w.addStep(this.step1Title,this.step1Html.format([this.source,this.source]));
	w.setButtons([{caption: this.upgradeLabel, tooltip: this.upgradePrompt, onClick: this.onClickUpgrade}]);
};

config.macros.upgrade.onClickUpgrade = function(e)
{
	var me = config.macros.upgrade;
	var w = new Wizard(this);
	if(window.location.protocol != "file:") {
		alert(me.errorCantUpgrade);
		return false;
	}
	if(story.areAnyDirty() || store.isDirty()) {
		alert(me.errorNotSaved);
		return false;
	}
	var localPath = getLocalPath(document.location.toString());
	var backupPath = getBackupPath(localPath,me.backupExtension);
	w.setValue("backupPath",backupPath);
	w.setButtons([],me.statusPreparingBackup);
	var original = loadOriginal(localPath);
	w.setButtons([],me.statusSavingBackup);
	var backup = config.browser.isIE ? ieCopyFile(backupPath,localPath) : saveFile(backupPath,original);
	if(backup != true) {
		w.setButtons([],me.errorSavingBackup);
		alert(me.errorSavingBackup);
		return false;
	}
	w.setButtons([],me.statusLoadingCore);
	var load = loadRemoteFile(me.source,me.onLoadCore,w);
	if(typeof load == "string") {
		w.setButtons([],me.errorLoadingCore);
		alert(me.errorLoadingCore);
		return false;
	}
	return false;
};

config.macros.upgrade.onLoadCore = function(status,params,responseText,url,xhr)
{
	var me = config.macros.upgrade;
	var w = params;
	var errMsg;
	if(!status)
		errMsg = me.errorLoadingCore;
	var newVer = me.extractVersion(responseText);
	if(!newVer)
		errMsg = me.errorCoreFormat;
	if(errMsg) {
		w.setButtons([],errMsg);
		alert(errMsg);
		return;
	}
	var onStartUpgrade = function(e) {
		w.setButtons([],me.statusSavingCore);
		var localPath = getLocalPath(document.location.toString());
		saveFile(localPath,responseText);
		w.setButtons([],me.statusReloadingCore);
		var backupPath = w.getValue("backupPath");
		var newLoc = document.location.toString() + '?time=' + new Date().convertToYYYYMMDDHHMM() + '#upgrade:[[' + encodeURI(backupPath) + ']]';
		window.setTimeout(function () {window.location = newLoc;},10);
	};
	var step2 = [me.step2Html_downgrade,me.step2Html_restore,me.step2Html_upgrade][compareVersions(version,newVer) + 1];
	w.addStep(me.step2Title,step2.format([formatVersion(newVer),formatVersion(version)]));
	w.setButtons([{caption: me.startLabel, tooltip: me.startPrompt, onClick: onStartUpgrade},{caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}]);
};

config.macros.upgrade.onCancel = function(e)
{
	var me = config.macros.upgrade;
	var w = new Wizard(this);
	w.addStep(me.step3Title,me.step3Html);
	w.setButtons([]);
	return false;
};

config.macros.upgrade.extractVersion = function(upgradeFile)
{
	var re = /^var version = \{title: "([^"]+)", major: (\d+), minor: (\d+), revision: (\d+)(, beta: (\d+)){0,1}, date: new Date\("([^"]+)"\)/mg;
	var m = re.exec(upgradeFile);
	return  m ? {title: m[1], major: m[2], minor: m[3], revision: m[4], beta: m[6], date: new Date(m[7])} : null;
};

function upgradeFrom(path)
{
	var importStore = new TiddlyWiki();
	var tw = loadFile(path);
	if(window.netscape !== undefined)
		tw = convertUTF8ToUnicode(tw);
	importStore.importTiddlyWiki(tw);
	importStore.forEachTiddler(function(title,tiddler) {
		if(!store.getTiddler(title)) {
			store.addTiddler(tiddler);
		}
	});
	refreshDisplay();
	saveChanges(); //# To create appropriate Markup* sections
	alert(config.messages.upgradeDone.format([formatVersion()]));
	window.location = window.location.toString().substr(0,window.location.toString().lastIndexOf('?'));
}

//--
//-- Sync macro
//--

// Synchronisation handlers
config.syncers = {};

// Sync state.
var currSync = null;

// sync macro
config.macros.sync.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	if(!wikifier.isStatic)
		this.startSync(place);
};

config.macros.sync.cancelSync = function()
{
	currSync = null;
};

config.macros.sync.startSync = function(place)
{
	if(currSync)
		config.macros.sync.cancelSync();
	currSync = {};
	currSync.syncList = this.getSyncableTiddlers();
	currSync.syncTasks = this.createSyncTasks(currSync.syncList);
	this.preProcessSyncableTiddlers(currSync.syncList);
	var wizard = new Wizard();
	currSync.wizard = wizard;
	wizard.createWizard(place,this.wizardTitle);
	wizard.addStep(this.step1Title,this.step1Html);
	var markList = wizard.getElement("markList");
	var listWrapper = document.createElement("div");
	markList.parentNode.insertBefore(listWrapper,markList);
	currSync.listView = ListView.create(listWrapper,currSync.syncList,this.listViewTemplate);
	this.processSyncableTiddlers(currSync.syncList);
	wizard.setButtons([{caption: this.syncLabel, tooltip: this.syncPrompt, onClick: this.doSync}]);
};

config.macros.sync.getSyncableTiddlers = function()
{
	var list = [];
	store.forEachTiddler(function(title,tiddler) {
		var syncItem = {};
		syncItem.serverType = tiddler.getServerType();
		syncItem.serverHost = tiddler.fields['server.host'];
		if(syncItem.serverType && syncItem.serverHost) {
			syncItem.serverWorkspace = tiddler.fields['server.workspace'];
			syncItem.tiddler = tiddler;
			syncItem.title = tiddler.title;
			syncItem.isTouched = tiddler.isTouched();
			syncItem.selected = syncItem.isTouched;
			syncItem.syncStatus = config.macros.sync.syncStatusList[syncItem.isTouched ? "changedLocally" : "none"];
			syncItem.status = syncItem.syncStatus.text;
			list.push(syncItem);
		}
		});
	list.sort(function(a,b) {return a.title < b.title ? -1 : (a.title == b.title ? 0 : +1);});
	return list;
};

config.macros.sync.preProcessSyncableTiddlers = function(syncList)
{
	for(var i=0; i<syncList.length; i++) {
		var si = syncList[i];
		si.serverUrl = si.syncTask.syncMachine.generateTiddlerInfo(si.tiddler).uri;
	}
};

config.macros.sync.processSyncableTiddlers = function(syncList)
{
	for(var i=0; i<syncList.length; i++) {
		var si = syncList[i];
		if(si.syncStatus.display)
			si.rowElement.style.display = si.syncStatus.display;
		if(si.syncStatus.className)
			si.rowElement.className = si.syncStatus.className;
	}
};

config.macros.sync.createSyncTasks = function(syncList)
{
	var syncTasks = [];
	for(var i=0; i<syncList.length; i++) {
		var si = syncList[i];
		var r = null;
		for(var j=0; j<syncTasks.length; j++) {
			var cst = syncTasks[j];
			if(si.serverType == cst.serverType && si.serverHost == cst.serverHost && si.serverWorkspace == cst.serverWorkspace)
				r = cst;
		}
		if(r) {
			si.syncTask = r;
			r.syncItems.push(si);
		} else {
			si.syncTask = this.createSyncTask(si);
			syncTasks.push(si.syncTask);
		}
	}
	return syncTasks;
};

config.macros.sync.createSyncTask = function(syncItem)
{
	var st = {};
	st.serverType = syncItem.serverType;
	st.serverHost = syncItem.serverHost;
	st.serverWorkspace = syncItem.serverWorkspace;
	st.syncItems = [syncItem];
	st.syncMachine = new SyncMachine(st.serverType,{
		start: function() {
			return this.openHost(st.serverHost,"openWorkspace");
		},
		openWorkspace: function() {
			return this.openWorkspace(st.serverWorkspace,"getTiddlerList");
		},
		getTiddlerList: function() {
			return this.getTiddlerList("onGetTiddlerList");
		},
		onGetTiddlerList: function(context) {
			var tiddlers = context.tiddlers;
			for(var i=0; i<st.syncItems.length; i++) {
				var si = st.syncItems[i];
				var f = tiddlers.findByField("title",si.title);
				if(f !== null) {
					if(tiddlers[f].fields['server.page.revision'] > si.tiddler.fields['server.page.revision']) {
						si.syncStatus = config.macros.sync.syncStatusList[si.isTouched ? 'changedBoth' : 'changedServer'];
					}
				} else {
					si.syncStatus = config.macros.sync.syncStatusList.notFound;
				}
				config.macros.sync.updateSyncStatus(si);
			}
		},
		getTiddler: function(title) {
			return this.getTiddler(title,"onGetTiddler");
		},
		onGetTiddler: function(context) {
			var tiddler = context.tiddler;
			var syncItem = st.syncItems.findByField("title",tiddler.title);
			if(syncItem !== null) {
				syncItem = st.syncItems[syncItem];
				store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, true, tiddler.created);
				syncItem.syncStatus = config.macros.sync.syncStatusList.gotFromServer;
				config.macros.sync.updateSyncStatus(syncItem);
			}
		},
		putTiddler: function(tiddler) {
			return this.putTiddler(tiddler,"onPutTiddler");
		},
		onPutTiddler: function(context) {
			var title = context.title;
			var syncItem = st.syncItems.findByField("title",title);
			if(syncItem !== null) {
				syncItem = st.syncItems[syncItem];
				store.resetTiddler(title);
				if(context.status) {
					syncItem.syncStatus = config.macros.sync.syncStatusList.putToServer;
					config.macros.sync.updateSyncStatus(syncItem);
				}
			}
		}
	});
	st.syncMachine.go();
	return st;
};

config.macros.sync.updateSyncStatus = function(syncItem)
{
	var e = syncItem.colElements["status"];
	removeChildren(e);
	createTiddlyText(e,syncItem.syncStatus.text);
	if(syncItem.syncStatus.display)
		syncItem.rowElement.style.display = syncItem.syncStatus.display;
	if(syncItem.syncStatus.className)
		syncItem.rowElement.className = syncItem.syncStatus.className;
};

config.macros.sync.doSync = function(e)
{
	var rowNames = ListView.getSelectedRows(currSync.listView);
	var sl = config.macros.sync.syncStatusList;
	for(var i=0; i<currSync.syncList.length; i++) {
		var si = currSync.syncList[i];
		if(rowNames.indexOf(si.title) != -1) {
			var r = true;
			switch(si.syncStatus) {
			case sl.changedServer:
				r = si.syncTask.syncMachine.go("getTiddler",si.title);
				break;
			case sl.notFound:
			case sl.changedLocally:
			case sl.changedBoth:
				r = si.syncTask.syncMachine.go("putTiddler",si.tiddler);
				break;
			default:
				break;
			}
			if(!r)
				displayMessage("Error in doSync: " + r);
		}
	}
	return false;
};

function SyncMachine(serverType,steps)
{
	this.serverType = serverType;
	this.adaptor = new config.adaptors[serverType]();
	this.steps = steps;
}

SyncMachine.prototype.go = function(step,context)
{
	var r = context ? context.status : null;
	if(typeof r == "string") {
		this.invokeError(r);
		return r;
	}
	var h = this.steps[step ? step : "start"];
	if(!h)
		return null;
	r = h.call(this,context);
	if(typeof r == "string")
		this.invokeError(r);
	return r;
};

SyncMachine.prototype.invokeError = function(message)
{
	if(this.steps.error)
		this.steps.error(message);
};

SyncMachine.prototype.openHost = function(host,nextStep)
{
	var me = this;
	return me.adaptor.openHost(host,null,null,function(context) {me.go(nextStep,context);});
};

SyncMachine.prototype.getWorkspaceList = function(nextStep)
{
	var me = this;
	return me.adaptor.getWorkspaceList(null,null,function(context) {me.go(nextStep,context);});
};

SyncMachine.prototype.openWorkspace = function(workspace,nextStep)
{
	var me = this;
	return me.adaptor.openWorkspace(workspace,null,null,function(context) {me.go(nextStep,context);});
};

SyncMachine.prototype.getTiddlerList = function(nextStep)
{
	var me = this;
	return me.adaptor.getTiddlerList(null,null,function(context) {me.go(nextStep,context);});
};

SyncMachine.prototype.generateTiddlerInfo = function(tiddler)
{
	return this.adaptor.generateTiddlerInfo(tiddler);
};

SyncMachine.prototype.getTiddler = function(title,nextStep)
{
	var me = this;
	return me.adaptor.getTiddler(title,null,null,function(context) {me.go(nextStep,context);});
};

SyncMachine.prototype.putTiddler = function(tiddler,nextStep)
{
	var me = this;
	if(me.adaptor.putTiddler)
		return me.adaptor.putTiddler(tiddler,null,null,function(context) {me.go(nextStep,context);});
	return false;
};

//--
//-- Manager UI for groups of tiddlers
//--

config.macros.plugins.handler = function(place,macroName,params,wikifier,paramString)
{
	var wizard = new Wizard();
	wizard.createWizard(place,this.wizardTitle);
	wizard.addStep(this.step1Title,this.step1Html);
	var markList = wizard.getElement("markList");
	var listWrapper = document.createElement("div");
	markList.parentNode.insertBefore(listWrapper,markList);
	listWrapper.setAttribute("refresh","macro");
	listWrapper.setAttribute("macroName","plugins");
	listWrapper.setAttribute("params",paramString);
	this.refresh(listWrapper,paramString);
};

config.macros.plugins.refresh = function(listWrapper,params)
{
	var wizard = new Wizard(listWrapper);
	var selectedRows = [];
	ListView.forEachSelector(listWrapper,function(e,rowName) {
			if(e.checked)
				selectedRows.push(e.getAttribute("rowName"));
		});
	removeChildren(listWrapper);
	params = params.parseParams("anon");
	var plugins = installedPlugins.slice(0);
	var t,tiddler,p;
	var configTiddlers = store.getTaggedTiddlers("systemConfig");
	for(t=0; t<configTiddlers.length; t++) {
		tiddler = configTiddlers[t];
		if(plugins.findByField("title",tiddler.title) == null) {
			p = getPluginInfo(tiddler);
			p.executed = false;
			p.log.splice(0,0,this.skippedText);
			plugins.push(p);
		}
	}
	for(t=0; t<plugins.length; t++) {
		p = plugins[t];
		p.size = p.tiddler.text ? p.tiddler.text.length : 0;
		p.forced = p.tiddler.isTagged("systemConfigForce");
		p.disabled = p.tiddler.isTagged("systemConfigDisable");
		p.Selected = selectedRows.indexOf(plugins[t].title) != -1;
		p.desc = store.getTiddlerSlice(p.tiddler.title,"Description");
	}
	if(plugins.length == 0) {
		createTiddlyElement(listWrapper,"em",null,null,this.noPluginText);
		wizard.setButtons([]);
	} else {
		var listView = ListView.create(listWrapper,plugins,this.listViewTemplate,this.onSelectCommand);
		wizard.setValue("listView",listView);
		wizard.setButtons([
				{caption: config.macros.plugins.removeLabel, tooltip: config.macros.plugins.removePrompt, onClick: config.macros.plugins.doRemoveTag},
				{caption: config.macros.plugins.deleteLabel, tooltip: config.macros.plugins.deletePrompt, onClick: config.macros.plugins.doDelete}
			]);
	}
};

config.macros.plugins.doRemoveTag = function(e)
{
	var wizard = new Wizard(this);
	var listView = wizard.getValue("listView");
	var rowNames = ListView.getSelectedRows(listView);
	if(rowNames.length == 0) {
		alert(config.messages.nothingSelected);
	} else {
		for(var t=0; t<rowNames.length; t++)
			store.setTiddlerTag(rowNames[t],false,"systemConfig");
	}
};

config.macros.plugins.doDelete = function(e)
{
	var wizard = new Wizard(this);
	var listView = wizard.getValue("listView");
	var rowNames = ListView.getSelectedRows(listView);
	if(rowNames.length == 0) {
		alert(config.messages.nothingSelected);
	} else {
		if(confirm(config.macros.plugins.confirmDeleteText.format([rowNames.join(", ")]))) {
			for(var t=0; t<rowNames.length; t++) {
				store.removeTiddler(rowNames[t]);
				story.closeTiddler(rowNames[t],true);
			}
		}
	}
};

//--
//-- Message area
//--

function getMessageDiv()
{
	var msgArea = document.getElementById("messageArea");
	if(!msgArea)
		return null;
	if(!msgArea.hasChildNodes())
		createTiddlyButton(createTiddlyElement(msgArea,"div",null,"messageToolbar"),
			config.messages.messageClose.text,
			config.messages.messageClose.tooltip,
			clearMessage);
	msgArea.style.display = "block";
	return createTiddlyElement(msgArea,"div");
}

function displayMessage(text,linkText)
{
	var e = getMessageDiv();
	if(!e) {
		alert(text);
		return;
	}
	if(linkText) {
		var link = createTiddlyElement(e,"a",null,null,text);
		link.href = linkText;
		link.target = "_blank";
	} else {
		e.appendChild(document.createTextNode(text));
	}
}

function clearMessage()
{
	var msgArea = document.getElementById("messageArea");
	if(msgArea) {
		removeChildren(msgArea);
		msgArea.style.display = "none";
	}
	return false;
}

//--
//-- Refresh mechanism
//--

config.notifyTiddlers = [
	{name: "StyleSheetLayout", notify: refreshStyles},
	{name: "StyleSheetColors", notify: refreshStyles},
	{name: "StyleSheet", notify: refreshStyles},
	{name: "StyleSheetPrint", notify: refreshStyles},
	{name: "PageTemplate", notify: refreshPageTemplate},
	{name: "SiteTitle", notify: refreshPageTitle},
	{name: "SiteSubtitle", notify: refreshPageTitle},
	{name: "ColorPalette", notify: refreshColorPalette},
	{name: null, notify: refreshDisplay}
];

config.refreshers = {
	link: function(e,changeList)
		{
		var title = e.getAttribute("tiddlyLink");
		refreshTiddlyLink(e,title);
		return true;
		},

	tiddler: function(e,changeList)
		{
		var title = e.getAttribute("tiddler");
		var template = e.getAttribute("template");
		if(changeList && changeList.indexOf(title) != -1 && !story.isDirty(title))
			story.refreshTiddler(title,template,true);
		else
			refreshElements(e,changeList);
		return true;
		},

	content: function(e,changeList)
		{
		var title = e.getAttribute("tiddler");
		var force = e.getAttribute("force");
		if(force != null || changeList == null || changeList.indexOf(title) != -1) {
			removeChildren(e);
			wikify(store.getTiddlerText(title,""),e,null,store.fetchTiddler(title));
			return true;
		} else
			return false;
		},

	macro: function(e,changeList)
		{
		var macro = e.getAttribute("macroName");
		var params = e.getAttribute("params");
		if(macro)
			macro = config.macros[macro];
		if(macro && macro.refresh)
			macro.refresh(e,params);
		return true;
		}
};

config.refresherData = {
	styleSheet: "StyleSheet",
	defaultStyleSheet: "StyleSheet",
	pageTemplate: "PageTemplate",
	defaultPageTemplate: "PageTemplate",
	colorPalette: "ColorPalette",
	defaultColorPalette: "ColorPalette"
};

function refreshElements(root,changeList)
{
	var nodes = root.childNodes;
	for(var c=0; c<nodes.length; c++) {
		var e = nodes[c], type = null;
		if(e.getAttribute && (e.tagName ? e.tagName != "IFRAME" : true))
			type = e.getAttribute("refresh");
		var refresher = config.refreshers[type];
		var refreshed = false;
		if(refresher != undefined)
			refreshed = refresher(e,changeList);
		if(e.hasChildNodes() && !refreshed)
			refreshElements(e,changeList);
	}
}

function applyHtmlMacros(root,tiddler)
{
	var e = root.firstChild;
	while(e) {
		var nextChild = e.nextSibling;
		if(e.getAttribute) {
			var macro = e.getAttribute("macro");
			if(macro) {
				e.removeAttribute("macro");
				var params = "";
				var p = macro.indexOf(" ");
				if(p != -1) {
					params = macro.substr(p+1);
					macro = macro.substr(0,p);
				}
				invokeMacro(e,macro,params,null,tiddler);
			}
		}
		if(e.hasChildNodes())
			applyHtmlMacros(e,tiddler);
		e = nextChild;
	}
}

function refreshPageTemplate(title)
{
	var stash = createTiddlyElement(document.body,"div");
	stash.style.display = "none";
	var display = story.getContainer();
	var nodes,t;
	if(display) {
		nodes = display.childNodes;
		for(t=nodes.length-1; t>=0; t--)
			stash.appendChild(nodes[t]);
	}
	var wrapper = document.getElementById("contentWrapper");

	var isAvailable = function(title) {
		var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1;
		if(s!=-1)
			title = title.substr(0,s);
		return store.tiddlerExists(title) || store.isShadowTiddler(title);
	};
	if(!title || !isAvailable(title))
		title = config.refresherData.pageTemplate;
	if(!isAvailable(title))
		title = config.refresherData.defaultPageTemplate; //# this one is always avaialable
	wrapper.innerHTML = store.getRecursiveTiddlerText(title,null,10);
	applyHtmlMacros(wrapper);
	refreshElements(wrapper);
	display = story.getContainer();
	removeChildren(display);
	if(!display)
		display = createTiddlyElement(wrapper,"div",story.containerId());
	nodes = stash.childNodes;
	for(t=nodes.length-1; t>=0; t--)
		display.appendChild(nodes[t]);
	removeNode(stash);
}

function refreshDisplay(hint)
{
	if(typeof hint == "string")
		hint = [hint];
	var e = document.getElementById("contentWrapper");
	refreshElements(e,hint);
	if(backstage.isPanelVisible()) {
		e = document.getElementById("backstage");
		refreshElements(e,hint);
	}
}

function refreshPageTitle()
{
	document.title = getPageTitle();
}

function getPageTitle()
{
	var st = wikifyPlain("SiteTitle");
	var ss = wikifyPlain("SiteSubtitle");
	return st + ((st == "" || ss == "") ? "" : " - ") + ss;
}

function refreshStyles(title,doc)
{
	setStylesheet(title == null ? "" : store.getRecursiveTiddlerText(title,"",10),title,doc || document);
}

function refreshColorPalette(title)
{
	if(!startingUp)
		refreshAll();
}

function refreshAll()
{
	refreshPageTemplate();
	refreshDisplay();
	refreshStyles("StyleSheetLayout");
	refreshStyles("StyleSheetColors");
	refreshStyles(config.refresherData.styleSheet);
	refreshStyles("StyleSheetPrint");
}

//--
//-- Options stuff
//--

config.optionHandlers = {
	'txt': {
		get: function(name) {return encodeCookie(config.options[name].toString());},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	},
	'chk': {
		get: function(name) {return config.options[name] ? "true" : "false";},
		set: function(name,value) {config.options[name] = value == "true";}
	}
};

function loadOptionsCookie()
{
	if(safeMode)
		return;
	var cookies = document.cookie.split(";");
	for(var c=0; c<cookies.length; c++) {
		var p = cookies[c].indexOf("=");
		if(p != -1) {
			var name = cookies[c].substr(0,p).trim();
			var value = cookies[c].substr(p+1).trim();
			var optType = name.substr(0,3);
			if(config.optionHandlers[optType] && config.optionHandlers[optType].set)
				config.optionHandlers[optType].set(name,value);
		}
	}
}

function saveOptionCookie(name)
{
	if(safeMode)
		return;
	var c = name + "=";
	var optType = name.substr(0,3);
	if(config.optionHandlers[optType] && config.optionHandlers[optType].get)
		c += config.optionHandlers[optType].get(name);
	c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";
	document.cookie = c;
}

function removeCookie(name)
{
	document.cookie = name + "=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;";
}

function encodeCookie(s)
{
	return escape(convertUnicodeToHtmlEntities(s));
}

function decodeCookie(s)
{
	s = unescape(s);
	var re = /&#[0-9]{1,5};/g;
	return s.replace(re,function($0) {return String.fromCharCode(eval($0.replace(/[&#;]/g,"")));});
}


config.macros.option.genericCreate = function(place,type,opt,className,desc)
{
	var typeInfo = config.macros.option.types[type];
	var c = document.createElement(typeInfo.elementType);
	if(typeInfo.typeValue)
		c.setAttribute("type",typeInfo.typeValue);
	c[typeInfo.eventName] = typeInfo.onChange;
	c.setAttribute("option",opt);
	c.className = className || typeInfo.className;
	if(config.optionsDesc[opt])
		c.setAttribute("title",config.optionsDesc[opt]);
	place.appendChild(c);
	if(desc != "no")
		createTiddlyText(place,config.optionsDesc[opt] || opt);
	c[typeInfo.valueField] = config.options[opt];
	return c;
};

config.macros.option.genericOnChange = function(e)
{
	var opt = this.getAttribute("option");
	if(opt) {
		var optType = opt.substr(0,3);
		var handler = config.macros.option.types[optType];
		if(handler.elementType && handler.valueField)
			config.macros.option.propagateOption(opt,handler.valueField,this[handler.valueField],handler.elementType,this);
	}
	return true;
};

config.macros.option.types = {
	'txt': {
		elementType: "input",
		valueField: "value",
		eventName: "onchange",
		className: "txtOptionInput",
		create: config.macros.option.genericCreate,
		onChange: config.macros.option.genericOnChange
	},
	'chk': {
		elementType: "input",
		valueField: "checked",
		eventName: "onclick",
		className: "chkOptionInput",
		typeValue: "checkbox",
		create: config.macros.option.genericCreate,
		onChange: config.macros.option.genericOnChange
	}
};

config.macros.option.propagateOption = function(opt,valueField,value,elementType,elem)
{
	config.options[opt] = value;
	saveOptionCookie(opt);
	var nodes = document.getElementsByTagName(elementType);
	for(var t=0; t<nodes.length; t++) {
		var optNode = nodes[t].getAttribute("option");
		if(opt == optNode && nodes[t]!=elem)
			nodes[t][valueField] = value;
	}
};

config.macros.option.handler = function(place,macroName,params,wikifier,paramString)
{
	params = paramString.parseParams("anon",null,true,false,false);
	var opt = (params[1] && params[1].name == "anon") ? params[1].value : getParam(params,"name",null);
	var className = (params[2] && params[2].name == "anon") ? params[2].value : getParam(params,"class",null);
	var desc = getParam(params,"desc","no");
	var type = opt.substr(0,3);
	var h = config.macros.option.types[type];
	if(h && h.create)
		h.create(place,type,opt,className,desc);
};

config.macros.options.handler = function(place,macroName,params,wikifier,paramString)
{
	params = paramString.parseParams("anon",null,true,false,false);
	var showUnknown = getParam(params,"showUnknown","no");
	var wizard = new Wizard();
	wizard.createWizard(place,this.wizardTitle);
	wizard.addStep(this.step1Title,this.step1Html);
	var markList = wizard.getElement("markList");
	var chkUnknown = wizard.getElement("chkUnknown");
	chkUnknown.checked = showUnknown == "yes";
	chkUnknown.onchange = this.onChangeUnknown;
	var listWrapper = document.createElement("div");
	markList.parentNode.insertBefore(listWrapper,markList);
	wizard.setValue("listWrapper",listWrapper);
	this.refreshOptions(listWrapper,showUnknown == "yes");
};

config.macros.options.refreshOptions = function(listWrapper,showUnknown)
{
	var opts = [];
	for(var n in config.options) {
		var opt = {};
		opt.option = "";
		opt.name = n;
		opt.lowlight = !config.optionsDesc[n];
		opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
		if(!opt.lowlight || showUnknown)
			opts.push(opt);
	}
	opts.sort(function(a,b) {return a.name.substr(3) < b.name.substr(3) ? -1 : (a.name.substr(3) == b.name.substr(3) ? 0 : +1);});
	var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
	for(n=0; n<opts.length; n++) {
		var type = opts[n].name.substr(0,3);
		var h = config.macros.option.types[type];
		if(h && h.create) {
			h.create(opts[n].colElements['option'],type,opts[n].name,null,"no");
		}
	}
};

config.macros.options.onChangeUnknown = function(e)
{
	var wizard = new Wizard(this);
	var listWrapper = wizard.getValue("listWrapper");
	removeChildren(listWrapper);
	config.macros.options.refreshOptions(listWrapper,this.checked);
	return false;
};

//--
//-- Saving
//--

var saveUsingSafari = false;

var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it
var endSaveArea = '</d' + 'iv>';

// If there are unsaved changes, force the user to confirm before exitting
function confirmExit()
{
	hadConfirmExit = true;
	if((store && store.isDirty && store.isDirty()) || (story && story.areAnyDirty && story.areAnyDirty()))
		return config.messages.confirmExit;
}

// Give the user a chance to save changes before exitting
function checkUnsavedChanges()
{
	if(store && store.isDirty && store.isDirty() && window.hadConfirmExit === false) {
		if(confirm(config.messages.unsavedChangesWarning))
			saveChanges();
	}
}

function updateLanguageAttribute(s)
{
	if(config.locale) {
		var mRE = /(<html(?:.*?)?)(?: xml:lang\="([a-z]+)")?(?: lang\="([a-z]+)")?>/;
		var m = mRE.exec(s);
		if(m) {
			var t = m[1];
			if(m[2])
				t += ' xml:lang="' + config.locale + '"';
			if(m[3])
				t += ' lang="' + config.locale + '"';
			t += ">";
			s = s.substr(0,m.index) + t + s.substr(m.index+m[0].length);
		}
	}
	return s;
}

function updateMarkupBlock(s,blockName,tiddlerName)
{
	return s.replaceChunk(
			"<!--%0-START-->".format([blockName]),
			"<!--%0-END-->".format([blockName]),
			"\n" + convertUnicodeToFileFormat(store.getRecursiveTiddlerText(tiddlerName,"")) + "\n");
}

function updateOriginal(original,posDiv,localPath)
{
	if(!posDiv)
		posDiv = locateStoreArea(original);
	if(!posDiv) {
		alert(config.messages.invalidFileError.format([localPath]));
		return null;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				convertUnicodeToFileFormat(store.allTiddlersAsHtml()) + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = convertUnicodeToFileFormat(getPageTitle()).htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateLanguageAttribute(revised);
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
}

function locateStoreArea(original)
{
	// Locate the storeArea div's
	var posOpeningDiv = original.indexOf(startSaveArea);
	var limitClosingDiv = original.indexOf("<"+"!--POST-STOREAREA--"+">");
	if(limitClosingDiv == -1)
		limitClosingDiv = original.indexOf("<"+"!--POST-BODY-START--"+">");
	var posClosingDiv = original.lastIndexOf(endSaveArea,limitClosingDiv == -1 ? original.length : limitClosingDiv);
	return (posOpeningDiv != -1 && posClosingDiv != -1) ? [posOpeningDiv,posClosingDiv] : null;
}

function autoSaveChanges(onlyIfDirty,tiddlers)
{
	if(config.options.chkAutoSave)
		saveChanges(onlyIfDirty,tiddlers);
}

function loadOriginal(localPath)
{
	return loadFile(localPath);
}

// Save this tiddlywiki with the pending changes
function saveChanges(onlyIfDirty,tiddlers)
{
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	var t0 = new Date();
	var originalPath = document.location.toString();
	if(originalPath.substr(0,5) != "file:") {
		alert(config.messages.notFileUrlError);
		if(store.tiddlerExists(config.messages.saveInstructions))
			story.displayTiddler(null,config.messages.saveInstructions);
		return;
	}
	var localPath = getLocalPath(originalPath);
	var original = loadOriginal(localPath);
	if(original == null) {
		alert(config.messages.cantSaveError);
		if(store.tiddlerExists(config.messages.saveInstructions))
			story.displayTiddler(null,config.messages.saveInstructions);
		return;
	}
	var posDiv = locateStoreArea(original);
	if(!posDiv) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	saveMain(localPath,original,posDiv);
	if(config.options.chkSaveBackups)
		saveBackup(localPath,original);
	if(config.options.chkSaveEmptyTemplate)
		saveEmpty(localPath,original,posDiv);
	if(config.options.chkGenerateAnRssFeed && saveRss instanceof Function)
		saveRss(localPath);
	if(config.options.chkDisplayInstrumentation)
		displayMessage("saveChanges " + (new Date()-t0) + " ms");
}

function saveMain(localPath,original,posDiv)
{
	var save;
	try {
		var revised = updateOriginal(original,posDiv,localPath);
		save = saveFile(localPath,revised);
	} catch (ex) {
		showException(ex);
	}
	if(save) {
		displayMessage(config.messages.mainSaved,"file://" + localPath);
		store.setDirty(false);
	} else {
		alert(config.messages.mainFailed);
	}
}

function saveBackup(localPath,original)
{
	var backupPath = getBackupPath(localPath);
	var backup = copyFile(backupPath,localPath);
	if(!backup)
		backup = saveFile(backupPath,original);
	if(backup)
		displayMessage(config.messages.backupSaved,"file://" + backupPath);
	else
		alert(config.messages.backupFailed);
}

function saveEmpty(localPath,original,posDiv)
{
	var emptyPath,p;
	if((p = localPath.lastIndexOf("/")) != -1)
		emptyPath = localPath.substr(0,p) + "/";
	else if((p = localPath.lastIndexOf("\\")) != -1)
		emptyPath = localPath.substr(0,p) + "\\";
	else
		emptyPath = localPath + ".";
	emptyPath += "empty.html";
	var empty = original.substr(0,posDiv[0] + startSaveArea.length) + original.substr(posDiv[1]);
	var emptySave = saveFile(emptyPath,empty);
	if(emptySave)
		displayMessage(config.messages.emptySaved,"file://" + emptyPath);
	else
		alert(config.messages.emptyFailed);
}

function getLocalPath(origPath)
{
	var originalPath = convertUriToUTF8(origPath,config.options.txtFileSystemCharSet);
	// Remove any location or query part of the URL
	var argPos = originalPath.indexOf("?");
	if(argPos != -1)
		originalPath = originalPath.substr(0,argPos);
	var hashPos = originalPath.indexOf("#");
	if(hashPos != -1)
		originalPath = originalPath.substr(0,hashPos);
	// Convert file://localhost/ to file:///
	if(originalPath.indexOf("file://localhost/") == 0)
		originalPath = "file://" + originalPath.substr(16);
	// Convert to a native file format
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") == 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") == 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
	return localPath;
}

function getBackupPath(localPath,title,extension)
{
	var slash = "\\";
	var dirPathPos = localPath.lastIndexOf("\\");
	if(dirPathPos == -1) {
		dirPathPos = localPath.lastIndexOf("/");
		slash = "/";
	}
	var backupFolder = config.options.txtBackupFolder;
	if(!backupFolder || backupFolder == "")
		backupFolder = ".";
	var backupPath = localPath.substr(0,dirPathPos) + slash + backupFolder + localPath.substr(dirPathPos);
	backupPath = backupPath.substr(0,backupPath.lastIndexOf(".")) + ".";
	if(title)
		backupPath += title.replace(/[\\\/\*\?\":<> ]/g,"_") + ".";
	backupPath += (new Date()).convertToYYYYMMDDHHMMSSMMM() + "." + (extension || "html");
	return backupPath;
}

//--
//-- RSS Saving
//--

function saveRss(localPath)
{
	var rssPath = localPath.substr(0,localPath.lastIndexOf(".")) + ".xml";
	if(saveFile(rssPath,convertUnicodeToFileFormat(generateRss())))
		displayMessage(config.messages.rssSaved,"file://" + rssPath);
	else
		alert(config.messages.rssFailed);
}

tiddlerToRssItem = function(tiddler,uri)
{
	var s = "<title" + ">" + tiddler.title.htmlEncode() + "</title" + ">\n";
	s += "<description>" + wikifyStatic(tiddler.text,null,tiddler).htmlEncode() + "</description>\n";
	for(var i=0; i<tiddler.tags.length; i++)
		s += "<category>" + tiddler.tags[i] + "</category>\n";
	s += "<link>" + uri + "#" + encodeURIComponent(String.encodeTiddlyLink(tiddler.title)) + "</link>\n";
	s +="<pubDate>" + tiddler.modified.toGMTString() + "</pubDate>\n";
	return s;
};

function generateRss()
{
	var s = [];
	var d = new Date();
	var u = store.getTiddlerText("SiteUrl");
	// Assemble the header
	s.push("<" + "?xml version=\"1.0\"?" + ">");
	s.push("<rss version=\"2.0\">");
	s.push("<channel>");
	s.push("<title" + ">" + wikifyPlain("SiteTitle").htmlEncode() + "</title" + ">");
	if(u)
		s.push("<link>" + u.htmlEncode() + "</link>");
	s.push("<description>" + wikifyPlain("SiteSubtitle").htmlEncode() + "</description>");
	s.push("<language>" + config.locale + "</language>");
	s.push("<copyright>Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + "</copyright>");
	s.push("<pubDate>" + d.toGMTString() + "</pubDate>");
	s.push("<lastBuildDate>" + d.toGMTString() + "</lastBuildDate>");
	s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
	s.push("<generator>TiddlyWiki " + formatVersion() + "</generator>");
	// The body
	var tiddlers = store.getTiddlers("modified","excludeLists");
	var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
	for(var i=tiddlers.length-1; i>=n; i--) {
		s.push("<item>\n" + tiddlerToRssItem(tiddlers[i],u) + "\n</item>");
	}
	// And footer
	s.push("</channel>");
	s.push("</rss>");
	// Save it all
	return s.join("\n");
}

//--
//-- Filesystem code
//--

function convertUTF8ToUnicode(u)
{
	return config.browser.isOpera || !window.netscape ? manualConvertUTF8ToUnicode(u) : mozConvertUTF8ToUnicode(u);
}

function manualConvertUTF8ToUnicode(utf)
{
	var uni = utf;
	var src = 0;
	var dst = 0;
	var b1, b2, b3;
	var c;
	while(src < utf.length) {
		b1 = utf.charCodeAt(src++);
		if(b1 < 0x80) {
			dst++;
		} else if(b1 < 0xE0) {
			b2 = utf.charCodeAt(src++);
			c = String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F));
			uni = uni.substring(0,dst++).concat(c,utf.substr(src));
		} else {
			b2 = utf.charCodeAt(src++);
			b3 = utf.charCodeAt(src++);
			c = String.fromCharCode(((b1 & 0xF) << 12) | ((b2 & 0x3F) << 6) | (b3 & 0x3F));
			uni = uni.substring(0,dst++).concat(c,utf.substr(src));
		}
	}
	return uni;
}

function mozConvertUTF8ToUnicode(u)
{
	try {
		netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
		converter.charset = "UTF-8";
	} catch(ex) {
		return manualConvertUTF8ToUnicode(u);
	} // fallback
	var s = converter.ConvertToUnicode(u);
	var fin = converter.Finish();
	return fin.length > 0 ? s+fin : s;
}

function convertUnicodeToFileFormat(s)
{
	return config.browser.isOpera || !window.netscape ? convertUnicodeToHtmlEntities(s) : mozConvertUnicodeToUTF8(s);
}

function convertUnicodeToHtmlEntities(s)
{
	var re = /[^\u0000-\u007F]/g;
	return s.replace(re,function($0) {return "&#" + $0.charCodeAt(0).toString() + ";";});
}

function convertUnicodeToUTF8(s)
{
// return convertUnicodeToFileFormat to allow plugin migration
	return convertUnicodeToFileFormat(s);
}

function manualConvertUnicodeToUTF8(s)
{
	return unescape(encodeURIComponent(s));
}

function mozConvertUnicodeToUTF8(s)
{
	try {
		netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
		converter.charset = "UTF-8";
	} catch(ex) {
		return manualConvertUnicodeToUTF8(s);
	} // fallback
	var u = converter.ConvertFromUnicode(s);
	var fin = converter.Finish();
	return fin.length > 0 ? u + fin : u;
}

function convertUriToUTF8(uri,charSet)
{
	if(window.netscape == undefined || charSet == undefined || charSet == "")
		return uri;
	try {
		netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		var converter = Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService);
	} catch(ex) {
		return uri;
	}
	return converter.convertURISpecToUTF8(uri,charSet);
}

function copyFile(dest,source)
{
	return config.browser.isIE ? ieCopyFile(dest,source) : false;
}

function saveFile(fileUrl,content)
{
	var r = mozillaSaveFile(fileUrl,content);
	if(!r)
		r = ieSaveFile(fileUrl,content);
	if(!r)
		r = javaSaveFile(fileUrl,content);
	return r;
}

function loadFile(fileUrl)
{
	var r = mozillaLoadFile(fileUrl);
	if((r == null) || (r == false))
		r = ieLoadFile(fileUrl);
	if((r == null) || (r == false))
		r = javaLoadFile(fileUrl);
	return r;
}

function ieCreatePath(path)
{
	try {
		var fso = new ActiveXObject("Scripting.FileSystemObject");
	} catch(ex) {
		return null;
	}

	var pos = path.lastIndexOf("\\");
	if(pos==-1)
		pos = path.lastIndexOf("/");
	if(pos!=-1)
		path = path.substring(0,pos+1);

	var scan = [path];
	var parent = fso.GetParentFolderName(path);
	while(parent && !fso.FolderExists(parent)) {
		scan.push(parent);
		parent = fso.GetParentFolderName(parent);
	}

	for(i=scan.length-1;i>=0;i--) {
		if(!fso.FolderExists(scan[i])) {
			fso.CreateFolder(scan[i]);
		}
	}
	return true;
}

// Returns null if it can't do it, false if there's an error, true if it saved OK
function ieSaveFile(filePath,content)
{
	ieCreatePath(filePath);
	try {
		var fso = new ActiveXObject("Scripting.FileSystemObject");
	} catch(ex) {
		return null;
	}
	var file = fso.OpenTextFile(filePath,2,-1,0);
	file.Write(content);
	file.Close();
	return true;
}

// Returns null if it can't do it, false if there's an error, or a string of the content if successful
function ieLoadFile(filePath)
{
	try {
		var fso = new ActiveXObject("Scripting.FileSystemObject");
		var file = fso.OpenTextFile(filePath,1);
		var content = file.ReadAll();
		file.Close();
	} catch(ex) {
		return null;
	}
	return content;
}

function ieCopyFile(dest,source)
{
	ieCreatePath(dest);
	try {
		var fso = new ActiveXObject("Scripting.FileSystemObject");
		fso.GetFile(source).Copy(dest);
	} catch(ex) {
		return false;
	}
	return true;
}

// Returns null if it can't do it, false if there's an error, true if it saved OK
function mozillaSaveFile(filePath,content)
{
	if(window.Components) {
		try {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
			var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
			file.initWithPath(filePath);
			if(!file.exists())
				file.create(0,0664);
			var out = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
			out.init(file,0x20|0x02,00004,null);
			out.write(content,content.length);
			out.flush();
			out.close();
			return true;
		} catch(ex) {
			return false;
		}
	}
	return null;
}

// Returns null if it can't do it, false if there's an error, or a string of the content if successful
function mozillaLoadFile(filePath)
{
	if(window.Components) {
		try {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
			var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
			file.initWithPath(filePath);
			if(!file.exists())
				return null;
			var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
			inputStream.init(file,0x01,00004,null);
			var sInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
			sInputStream.init(inputStream);
			var contents = sInputStream.read(sInputStream.available());
			sInputStream.close();
			inputStream.close();
			return contents;
		} catch(ex) {
			return false;
		}
	}
	return null;
}

function javaUrlToFilename(url)
{
	var f = "//localhost";
	if(url.indexOf(f) == 0)
		return url.substring(f.length);
	var i = url.indexOf(":");
	return i > 0 ? url.substring(i-1) : url;
}

function javaSaveFile(filePath,content)
{
	try {
		if(document.applets["TiddlySaver"])
			return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content);
	} catch(ex) {
	}
	try {
		var s = new java.io.PrintStream(new java.io.FileOutputStream(javaUrlToFilename(filePath)));
		s.print(content);
		s.close();
	} catch(ex) {
		return null;
	}
	return true;
}

function javaLoadFile(filePath)
{
	try {
		if(document.applets["TiddlySaver"])
			return String(document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8"));
	} catch(ex) {
	}
	var content = [];
	try {
		var r = new java.io.BufferedReader(new java.io.FileReader(javaUrlToFilename(filePath)));
		var line;
		while((line = r.readLine()) != null)
			content.push(new String(line));
		r.close();
	} catch(ex) {
		return null;
	}
	return content.join("\n");
}

//--
//-- Server adaptor base class
//--

function AdaptorBase()
{
	this.host = null;
	this.store = null;
	return this;
}

AdaptorBase.prototype.close = function()
{
	return true;
};

AdaptorBase.prototype.fullHostName = function(host)
{
	if(!host)
		return '';
	host = host.trim();
	if(!host.match(/:\/\//))
		host = 'http://' + host;
	if(host.substr(host.length-1) == '/')
		host = host.substr(0,host.length-1);
	return host;
};

AdaptorBase.minHostName = function(host)
{
	return host ? host.replace(/^http:\/\//,'').replace(/\/$/,'') : '';
};

AdaptorBase.prototype.setContext = function(context,userParams,callback)
{
	if(!context) context = {};
	context.userParams = userParams;
	if(callback) context.callback = callback;
	context.adaptor = this;
	if(!context.host)
		context.host = this.host;
	context.host = this.fullHostName(context.host);
	if(!context.workspace)
		context.workspace = this.workspace;
	return context;
};

// Open the specified host
AdaptorBase.prototype.openHost = function(host,context,userParams,callback)
{
	this.host = host;
	context = this.setContext(context,userParams,callback);
	context.status = true;
	if(callback)
		window.setTimeout(function() {context.callback(context,userParams);},10);
	return true;
};

// Open the specified workspace
AdaptorBase.prototype.openWorkspace = function(workspace,context,userParams,callback)
{
	this.workspace = workspace;
	context = this.setContext(context,userParams,callback);
	context.status = true;
	if(callback)
		window.setTimeout(function() {callback(context,userParams);},10);
	return true;
};

//--
//-- Server adaptor for talking to static TiddlyWiki files
//--

function FileAdaptor()
{
}

FileAdaptor.prototype = new AdaptorBase();

FileAdaptor.serverType = 'file';
FileAdaptor.serverLabel = 'TiddlyWiki';

FileAdaptor.loadTiddlyWikiCallback = function(status,context,responseText,url,xhr)
{
	context.status = status;
	if(!status) {
		context.statusText = "Error reading file";
	} else {
		context.adaptor.store = new TiddlyWiki();
		if(!context.adaptor.store.importTiddlyWiki(responseText)) {
			context.statusText = config.messages.invalidFileError.format([url]);
			context.status = false;
		}
	}
	context.complete(context,context.userParams);
};

// Get the list of workspaces on a given server
FileAdaptor.prototype.getWorkspaceList = function(context,userParams,callback)
{
	context = this.setContext(context,userParams,callback);
	context.workspaces = [{title:"(default)"}];
	context.status = true;
	if(callback)
		window.setTimeout(function() {callback(context,userParams);},10);
	return true;
};

// Gets the list of tiddlers within a given workspace
FileAdaptor.prototype.getTiddlerList = function(context,userParams,callback,filter)
{
	context = this.setContext(context,userParams,callback);
	if(!context.filter)
		context.filter = filter;
	context.complete = FileAdaptor.getTiddlerListComplete;
	if(this.store) {
		var ret = context.complete(context,context.userParams);
	} else {
		ret = loadRemoteFile(context.host,FileAdaptor.loadTiddlyWikiCallback,context);
		if(typeof ret != "string")
			ret = true;
	}
	return ret;
};

FileAdaptor.getTiddlerListComplete = function(context,userParams)
{
	if(context.status) {
		if(context.filter) {
			context.tiddlers = context.adaptor.store.filterTiddlers(context.filter);
		} else {
			context.tiddlers = [];
			context.adaptor.store.forEachTiddler(function(title,tiddler) {context.tiddlers.push(tiddler);});
		}
		for(var i=0; i<context.tiddlers.length; i++) {
			context.tiddlers[i].fields['server.type'] = FileAdaptor.serverType;
			context.tiddlers[i].fields['server.host'] = AdaptorBase.minHostName(context.host);
			context.tiddlers[i].fields['server.page.revision'] = context.tiddlers[i].modified.convertToYYYYMMDDHHMM();
		}
		context.status = true;
	}
	if(context.callback) {
		window.setTimeout(function() {context.callback(context,userParams);},10);
	}
	return true;
};

FileAdaptor.prototype.generateTiddlerInfo = function(tiddler)
{
	var info = {};
	info.uri = tiddler.fields['server.host'] + "#" + tiddler.title;
	return info;
};

// Retrieve a tiddler from a given workspace on a given server
FileAdaptor.prototype.getTiddler = function(title,context,userParams,callback)
{
	context = this.setContext(context,userParams,callback);
	context.title = title;
	context.complete = FileAdaptor.getTiddlerComplete;
	return context.adaptor.store ?
		context.complete(context,context.userParams) :
		loadRemoteFile(context.host,FileAdaptor.loadTiddlyWikiCallback,context);
};

FileAdaptor.getTiddlerComplete = function(context,userParams)
{
	var t = context.adaptor.store.fetchTiddler(context.title);
	t.fields['server.type'] = FileAdaptor.serverType;
	t.fields['server.host'] = AdaptorBase.minHostName(context.host);
	t.fields['server.page.revision'] = t.modified.convertToYYYYMMDDHHMM();
	context.tiddler = t;
	context.status = true;
	if(context.allowSynchronous) {
		context.isSynchronous = true;
		context.callback(context,userParams);
	} else {
		window.setTimeout(function() {context.callback(context,userParams);},10);
	}
	return true;
};

FileAdaptor.prototype.close = function()
{
	delete this.store;
	this.store = null;
};

config.adaptors[FileAdaptor.serverType] = FileAdaptor;

config.defaultAdaptor = FileAdaptor.serverType;

//--
//-- Remote HTTP requests
//--

function loadRemoteFile(url,callback,params)
{
	return httpReq("GET",url,callback,params);
}

function httpReq(type,url,callback,params,headers,data,contentType,username,password,allowCache)
{
	var x = null;
	try {
		x = new XMLHttpRequest(); //# Modern
	} catch(ex) {
		try {
			x = new ActiveXObject("Msxml2.XMLHTTP"); //# IE 6
		} catch(ex2) {
		}
	}
	if(!x)
		return "Can't create XMLHttpRequest object";
	x.onreadystatechange = function() {
		try {
			var status = x.status;
		} catch(ex) {
			status = false;
		}
		if(x.readyState == 4 && callback && (status !== undefined)) {
			if([0, 200, 201, 204, 207].contains(status))
				callback(true,params,x.responseText,url,x);
			else
				callback(false,params,null,url,x);
			x.onreadystatechange = function(){};
			x = null;
		}
	};
	if(window.Components && window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)
		window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	try {
		if(!allowCache)
			url = url + (url.indexOf("?") < 0 ? "?" : "&") + "nocache=" + Math.random();
		x.open(type,url,true,username,password);
		if(data)
			x.setRequestHeader("Content-Type", contentType || "application/x-www-form-urlencoded");
		if(x.overrideMimeType)
			x.setRequestHeader("Connection", "close");
		if(headers) {
			for(var n in headers)
				x.setRequestHeader(n,headers[n]);
		}
		x.setRequestHeader("X-Requested-With", "TiddlyWiki " + formatVersion());
		x.send(data);
	} catch(ex) {
		return exceptionText(ex);
	}
	return x;
}

// included for compatibility
function getXMLHttpRequest()
{
	try {
		var x = new XMLHttpRequest(); // Modern
	} catch(ex) {
		try {
			x = new ActiveXObject("Msxml2.XMLHTTP"); // IE 6
		} catch (ex2) {
			return null;
		}
	}
	return x;
}

// included for compatibility
function doHttp(type,url,data,contentType,username,password,callback,params,headers,allowCache)
{
	return httpReq(type,url,callback,params,headers,data,contentType,username,password,allowCache);
}

//--
//-- TiddlyWiki-specific utility functions
//--

function formatVersion(v)
{
	v = v || version;
	return v.major + "." + v.minor + "." + v.revision + (v.beta ? " (beta " + v.beta + ")" : "");
}

function compareVersions(v1,v2)
{
	var a = ["major","minor","revision"];
	for(var i = 0; i<a.length; i++) {
		var x1 = v1[a[i]] || 0;
		var x2 = v2[a[i]] || 0;
		if(x1<x2)
			return 1;
		if(x1>x2)
			return -1;
	}
	x1 = v1.beta || 9999;
	x2 = v2.beta || 9999;
	if(x1<x2)
		return 1;
	return x1 > x2 ? -1 : 0;
}

function createTiddlyButton(parent,text,tooltip,action,className,id,accessKey,attribs)
{
	var btn = document.createElement("a");
	if(action) {
		btn.onclick = action;
		btn.setAttribute("href","javascript:;");
	}
	if(tooltip)
		btn.setAttribute("title",tooltip);
	if(text)
		btn.appendChild(document.createTextNode(text));
	btn.className = className || "button";
	if(id)
		btn.id = id;
	if(attribs) {
		for(var i in attribs) {
			btn.setAttribute(i,attribs[i]);
		}
	}
	if(parent)
		parent.appendChild(btn);
	if(accessKey)
		btn.setAttribute("accessKey",accessKey);
	return btn;
}

function createTiddlyLink(place,title,includeText,className,isStatic,linkedFromTiddler,noToggle)
{
	var text = includeText ? title : null;
	var i = getTiddlyLinkInfo(title,className);
	var btn = isStatic ? createExternalLink(place,store.getTiddlerText("SiteUrl",null) + "#" + title) : createTiddlyButton(place,text,i.subTitle,onClickTiddlerLink,i.classes);
	if(isStatic)
		btn.className += ' ' + className;
	btn.setAttribute("refresh","link");
	btn.setAttribute("tiddlyLink",title);
	if(noToggle)
		btn.setAttribute("noToggle","true");
	if(linkedFromTiddler) {
		var fields = linkedFromTiddler.getInheritedFields();
		if(fields)
			btn.setAttribute("tiddlyFields",fields);
	}
	return btn;
}

function refreshTiddlyLink(e,title)
{
	var i = getTiddlyLinkInfo(title,e.className);
	e.className = i.classes;
	e.title = i.subTitle;
}

function getTiddlyLinkInfo(title,currClasses)
{
	var classes = currClasses ? currClasses.split(" ") : [];
	classes.pushUnique("tiddlyLink");
	var tiddler = store.fetchTiddler(title);
	var subTitle;
	if(tiddler) {
		subTitle = tiddler.getSubtitle();
		classes.pushUnique("tiddlyLinkExisting");
		classes.remove("tiddlyLinkNonExisting");
		classes.remove("shadow");
	} else {
		classes.remove("tiddlyLinkExisting");
		classes.pushUnique("tiddlyLinkNonExisting");
		if(store.isShadowTiddler(title)) {
			subTitle = config.messages.shadowedTiddlerToolTip.format([title]);
			classes.pushUnique("shadow");
		} else {
			subTitle = config.messages.undefinedTiddlerToolTip.format([title]);
			classes.remove("shadow");
		}
	}
	if(typeof config.annotations[title]=="string")
		subTitle = config.annotations[title];
	return {classes: classes.join(" "),subTitle: subTitle};
}

function createExternalLink(place,url)
{
	var link = document.createElement("a");
	link.className = "externalLink";
	link.href = url;
	link.title = config.messages.externalLinkTooltip.format([url]);
	if(config.options.chkOpenInNewWindow)
		link.target = "_blank";
	place.appendChild(link);
	return link;
}

// Event handler for clicking on a tiddly link
function onClickTiddlerLink(ev)
{
	var e = ev || window.event;
	var target = resolveTarget(e);
	var link = target;
	var title = null;
	var fields = null;
	var noToggle = null;
	do {
		title = link.getAttribute("tiddlyLink");
		fields = link.getAttribute("tiddlyFields");
		noToggle = link.getAttribute("noToggle");
		link = link.parentNode;
	} while(title == null && link != null);
	if(!store.isShadowTiddler(title)) {
		var f = fields ? fields.decodeHashMap() : {};
		fields = String.encodeHashMap(merge(f,config.defaultCustomFields,true));
	}
	if(title) {
		var toggling = e.metaKey || e.ctrlKey;
		if(config.options.chkToggleLinks)
			toggling = !toggling;
		if(noToggle)
			toggling = false;
		if(store.getTiddler(title))
			fields = null;
		story.displayTiddler(target,title,null,true,null,fields,toggling);
	}
	clearMessage();
	return false;
}

// Create a button for a tag with a popup listing all the tiddlers that it tags
function createTagButton(place,tag,excludeTiddler,title,tooltip)
{
	var btn = createTiddlyButton(place,title||tag,(tooltip||config.views.wikified.tag.tooltip).format([tag]),onClickTag);
	btn.setAttribute("tag",tag);
	if(excludeTiddler)
		btn.setAttribute("tiddler",excludeTiddler);
	return btn;
}

// Event handler for clicking on a tiddler tag
function onClickTag(ev)
{
	var e = ev || window.event;
	var popup = Popup.create(this);
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	if(popup && tag) {
		var tagged = store.getTaggedTiddlers(tag);
		var titles = [];
		var li,r;
		for(r=0;r<tagged.length;r++) {
			if(tagged[r].title != title)
				titles.push(tagged[r].title);
		}
		var lingo = config.views.wikified.tag;
		if(titles.length > 0) {
			var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);
			openAll.setAttribute("tag",tag);
			createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
			for(r=0; r<titles.length; r++) {
				createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);
			}
		} else {
			createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));
		}
		createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
		var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);
		createTiddlyText(h,lingo.openTag.format([tag]));
	}
	Popup.show();
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
	return false;
}

// Event handler for 'open all' on a tiddler popup
function onClickTagOpenAll(ev)
{
	var tiddlers = store.getTaggedTiddlers(this.getAttribute("tag"));
	story.displayTiddlers(this,tiddlers);
	return false;
}

function onClickError(ev)
{
	var e = ev || window.event;
	var popup = Popup.create(this);
	var lines = this.getAttribute("errorText").split("\n");
	for(var t=0; t<lines.length; t++)
		createTiddlyElement(popup,"li",null,null,lines[t]);
	Popup.show();
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
	return false;
}

function createTiddlyDropDown(place,onchange,options,defaultValue)
{
	var sel = createTiddlyElement(place,"select");
	sel.onchange = onchange;
	for(var t=0; t<options.length; t++) {
		var e = createTiddlyElement(sel,"option",null,null,options[t].caption);
		e.value = options[t].name;
		if(options[t].name == defaultValue)
			e.selected = true;
	}
	return sel;
}

function createTiddlyPopup(place,caption,tooltip,tiddler)
{
	if(tiddler.text) {
		createTiddlyLink(place,caption,true);
		var btn = createTiddlyButton(place,glyph("downArrow"),tooltip,onClickTiddlyPopup,"tiddlerPopupButton");
		btn.tiddler = tiddler;
	} else {
		createTiddlyText(place,caption);
	}
}

function onClickTiddlyPopup(ev)
{
	var e = ev || window.event;
	var tiddler = this.tiddler;
	if(tiddler.text) {
		var popup = Popup.create(this,"div","popupTiddler");
		wikify(tiddler.text,popup,null,tiddler);
		Popup.show();
	}
	if(e) e.cancelBubble = true;
	if(e && e.stopPropagation) e.stopPropagation();
	return false;
}

function createTiddlyError(place,title,text)
{
	var btn = createTiddlyButton(place,title,null,onClickError,"errorButton");
	if(text) btn.setAttribute("errorText",text);
}

function merge(dst,src,preserveExisting)
{
	for(var i in src) {
		if(!preserveExisting || dst[i] === undefined)
			dst[i] = src[i];
	}
	return dst;
}

// Returns a string containing the description of an exception, optionally prepended by a message
function exceptionText(e,message)
{
	var s = e.description || e.toString();
	return message ? "%0:\n%1".format([message,s]) : s;
}

// Displays an alert of an exception description with optional message
function showException(e,message)
{
	alert(exceptionText(e,message));
}

function alertAndThrow(m)
{
	alert(m);
	throw(m);
}

function glyph(name)
{
	var g = config.glyphs;
	var b = g.currBrowser;
	if(b == null) {
		b = 0;
		while(!g.browsers[b]() && b < g.browsers.length-1)
			b++;
		g.currBrowser = b;
	}
	if(!g.codes[name])
		return "";
	return g.codes[name][b];
}

if(!window.console) {
	console = {tiddlywiki:true,log:function(message) {displayMessage(message);}};
}

//-
//- Animation engine
//-

function Animator()
{
	this.running = 0; // Incremented at start of each animation, decremented afterwards. If zero, the interval timer is disabled
	this.timerID = 0; // ID of the timer used for animating
	this.animations = []; // List of animations in progress
	return this;
}

// Start animation engine
Animator.prototype.startAnimating = function() //# Variable number of arguments
{
	for(var t=0; t<arguments.length; t++)
		this.animations.push(arguments[t]);
	if(this.running == 0) {
		var me = this;
		this.timerID = window.setInterval(function() {me.doAnimate(me);},10);
	}
	this.running += arguments.length;
};

// Perform an animation engine tick, calling each of the known animation modules
Animator.prototype.doAnimate = function(me)
{
	var a = 0;
	while(a < me.animations.length) {
		var animation = me.animations[a];
		if(animation.tick()) {
			a++;
		} else {
			me.animations.splice(a,1);
			if(--me.running == 0)
				window.clearInterval(me.timerID);
		}
	}
};

Animator.slowInSlowOut = function(progress)
{
	return(1-((Math.cos(progress * Math.PI)+1)/2));
};

//--
//-- Morpher animation
//--

// Animate a set of properties of an element
function Morpher(element,duration,properties,callback)
{
	this.element = element;
	this.duration = duration;
	this.properties = properties;
	this.startTime = new Date();
	this.endTime = Number(this.startTime) + duration;
	this.callback = callback;
	this.tick();
	return this;
}

Morpher.prototype.assignStyle = function(element,style,value)
{
	switch(style) {
	case "-tw-vertScroll":
		window.scrollTo(findScrollX(),value);
		break;
	case "-tw-horizScroll":
		window.scrollTo(value,findScrollY());
		break;
	default:
		element.style[style] = value;
		break;
	}
};

Morpher.prototype.stop = function()
{
	for(var t=0; t<this.properties.length; t++) {
		var p = this.properties[t];
		if(p.atEnd !== undefined) {
			this.assignStyle(this.element,p.style,p.atEnd);
		}
	}
	if(this.callback)
		this.callback(this.element,this.properties);
};

Morpher.prototype.tick = function()
{
	var currTime = Number(new Date());
	var progress = Animator.slowInSlowOut(Math.min(1,(currTime-this.startTime)/this.duration));
	for(var t=0; t<this.properties.length; t++) {
		var p = this.properties[t];
		if(p.start !== undefined && p.end !== undefined) {
			var template = p.template || "%0";
			switch(p.format) {
			case undefined:
			case "style":
				var v = p.start + (p.end-p.start) * progress;
				this.assignStyle(this.element,p.style,template.format([v]));
				break;
			case "color":
				break;
			}
		}
	}
	if(currTime >= this.endTime) {
		this.stop();
		return false;
	}
	return true;
};

//--
//-- Zoomer animation
//--

function Zoomer(text,startElement,targetElement,unused)
{
	var e = createTiddlyElement(document.body,"div",null,"zoomer");
	createTiddlyElement(e,"div",null,null,text);
	var winWidth = findWindowWidth();
	var winHeight = findWindowHeight();
	var p = [
		{style: 'left', start: findPosX(startElement), end: findPosX(targetElement), template: '%0px'},
		{style: 'top', start: findPosY(startElement), end: findPosY(targetElement), template: '%0px'},
		{style: 'width', start: Math.min(startElement.scrollWidth,winWidth), end: Math.min(targetElement.scrollWidth,winWidth), template: '%0px', atEnd: 'auto'},
		{style: 'height', start: Math.min(startElement.scrollHeight,winHeight), end: Math.min(targetElement.scrollHeight,winHeight), template: '%0px', atEnd: 'auto'},
		{style: 'fontSize', start: 8, end: 24, template: '%0pt'}
	];
	var c = function(element,properties) {removeNode(element);};
	return new Morpher(e,config.animDuration,p,c);
}

//--
//-- Scroller animation
//--

function Scroller(targetElement)
{
	var p = [{style: '-tw-vertScroll', start: findScrollY(), end: ensureVisible(targetElement)}];
	return new Morpher(targetElement,config.animDuration,p);
}

//--
//-- Slider animation
//--

// deleteMode - "none", "all" [delete target element and it's children], [only] "children" [but not the target element]
function Slider(element,opening,unused,deleteMode)
{
	element.style.overflow = 'hidden';
	if(opening)
		element.style.height = '0px'; // Resolves a Firefox flashing bug
	element.style.display = 'block';
	var left = findPosX(element);
	var width = element.scrollWidth;
	var height = element.scrollHeight;
	var winWidth = findWindowWidth();
	var p = [];
	var c = null;
	if(opening) {
		p.push({style: 'height', start: 0, end: height, template: '%0px', atEnd: 'auto'});
		p.push({style: 'opacity', start: 0, end: 1, template: '%0'});
		p.push({style: 'filter', start: 0, end: 100, template: 'alpha(opacity:%0)'});
	} else {
		p.push({style: 'height', start: height, end: 0, template: '%0px'});
		p.push({style: 'display', atEnd: 'none'});
		p.push({style: 'opacity', start: 1, end: 0, template: '%0'});
		p.push({style: 'filter', start: 100, end: 0, template: 'alpha(opacity:%0)'});
		switch(deleteMode) {
		case "all":
			c = function(element,properties) {removeNode(element);};
			break;
		case "children":
			c = function(element,properties) {removeChildren(element);};
			break;
		}
	}
	return new Morpher(element,config.animDuration,p,c);
}

//--
//-- Popup menu
//--

var Popup = {
	stack: [] // Array of objects with members root: and popup:
	};

Popup.create = function(root,elem,className)
{
	var stackPosition = this.find(root,"popup");
	Popup.remove(stackPosition+1);
	var popup = createTiddlyElement(document.body,elem || "ol","popup",className || "popup");
	popup.stackPosition = stackPosition;
	Popup.stack.push({root: root, popup: popup});
	return popup;
};

Popup.onDocumentClick = function(ev)
{
	var e = ev || window.event;
	if(e.eventPhase == undefined)
		Popup.remove();
	else if(e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET)
		Popup.remove();
	return true;
};

Popup.show = function(valign,halign,offset)
{
	var curr = Popup.stack[Popup.stack.length-1];
	this.place(curr.root,curr.popup,valign,halign,offset);
	addClass(curr.root,"highlight");
	if(config.options.chkAnimate && anim && typeof Scroller == "function")
		anim.startAnimating(new Scroller(curr.popup));
	else
		window.scrollTo(0,ensureVisible(curr.popup));
};

Popup.place = function(root,popup,valign,halign,offset)
{
	if(!offset)
		var offset = {x:0,y:0};
	if(popup.stackPosition >= 0 && !valign && !halign) {
		offset.x = offset.x + root.offsetWidth;
	} else {
		offset.x = (halign == 'right') ? offset.x + root.offsetWidth : offset.x;
		offset.y = (valign == 'top') ? offset.y : offset.y + root.offsetHeight;
	}
	var rootLeft = findPosX(root);
	var rootTop = findPosY(root);
	var popupLeft = rootLeft + offset.x;
	var popupTop = rootTop + offset.y;
	var winWidth = findWindowWidth();
	if(popup.offsetWidth > winWidth*0.75)
		popup.style.width = winWidth*0.75 + "px";
	var popupWidth = popup.offsetWidth;
	var scrollWidth = winWidth - document.body.offsetWidth;
	if(popupLeft + popupWidth > winWidth - scrollWidth - 1) {
		if(halign == 'right')
			popupLeft = popupLeft - root.offsetWidth - popupWidth;
		else
			popupLeft = winWidth - popupWidth - scrollWidth - 1;
	}
	popup.style.left = popupLeft + "px";
	popup.style.top = popupTop + "px";
	popup.style.display = "block";
};

Popup.find = function(e)
{
	var pos = -1;
	for (var t=this.stack.length-1; t>=0; t--) {
		if(isDescendant(e,this.stack[t].popup))
			pos = t;
	}
	return pos;
};

Popup.remove = function(pos)
{
	if(!pos) var pos = 0;
	if(Popup.stack.length > pos) {
		Popup.removeFrom(pos);
	}
};

Popup.removeFrom = function(from)
{
	for(var t=Popup.stack.length-1; t>=from; t--) {
		var p = Popup.stack[t];
		removeClass(p.root,"highlight");
		removeNode(p.popup);
	}
	Popup.stack = Popup.stack.slice(0,from);
};

//--
//-- Wizard support
//--

function Wizard(elem)
{
	if(elem) {
		this.formElem = findRelated(elem,"wizard","className");
		this.bodyElem = findRelated(this.formElem.firstChild,"wizardBody","className","nextSibling");
		this.footElem = findRelated(this.formElem.firstChild,"wizardFooter","className","nextSibling");
	} else {
		this.formElem = null;
		this.bodyElem = null;
		this.footElem = null;
	}
}

Wizard.prototype.setValue = function(name,value)
{
	if(this.formElem)
		this.formElem[name] = value;
};

Wizard.prototype.getValue = function(name)
{
	return this.formElem ? this.formElem[name] : null;
};

Wizard.prototype.createWizard = function(place,title)
{
	this.formElem = createTiddlyElement(place,"form",null,"wizard");
	createTiddlyElement(this.formElem,"h1",null,null,title);
	this.bodyElem = createTiddlyElement(this.formElem,"div",null,"wizardBody");
	this.footElem = createTiddlyElement(this.formElem,"div",null,"wizardFooter");
};

Wizard.prototype.clear = function()
{
	removeChildren(this.bodyElem);
};

Wizard.prototype.setButtons = function(buttonInfo,status)
{
	removeChildren(this.footElem);
	for(var t=0; t<buttonInfo.length; t++) {
		createTiddlyButton(this.footElem,buttonInfo[t].caption,buttonInfo[t].tooltip,buttonInfo[t].onClick);
		insertSpacer(this.footElem);
		}
	if(typeof status == "string") {
		createTiddlyElement(this.footElem,"span",null,"status",status);
	}
};

Wizard.prototype.addStep = function(stepTitle,html)
{
	removeChildren(this.bodyElem);
	var w = createTiddlyElement(this.bodyElem,"div");
	createTiddlyElement(w,"h2",null,null,stepTitle);
	var step = createTiddlyElement(w,"div",null,"wizardStep");
	step.innerHTML = html;
	applyHtmlMacros(step,tiddler);
};

Wizard.prototype.getElement = function(name)
{
	return this.formElem.elements[name];
};

//--
//-- ListView gadget
//--

var ListView = {};

// Create a listview
ListView.create = function(place,listObject,listTemplate,callback,className)
{
	var table = createTiddlyElement(place,"table",null,className || "listView twtable");
	var thead = createTiddlyElement(table,"thead");
	var r = createTiddlyElement(thead,"tr");
	for(var t=0; t<listTemplate.columns.length; t++) {
		var columnTemplate = listTemplate.columns[t];
		var c = createTiddlyElement(r,"th");
		var colType = ListView.columnTypes[columnTemplate.type];
		if(colType && colType.createHeader) {
			colType.createHeader(c,columnTemplate,t);
			if(columnTemplate.className)
				addClass(c,columnTemplate.className);
		}
	}
	var tbody = createTiddlyElement(table,"tbody");
	for(var rc=0; rc<listObject.length; rc++) {
		var rowObject = listObject[rc];
		r = createTiddlyElement(tbody,"tr");
		for(c=0; c<listTemplate.rowClasses.length; c++) {
			if(rowObject[listTemplate.rowClasses[c].field])
				addClass(r,listTemplate.rowClasses[c].className);
		}
		rowObject.rowElement = r;
		rowObject.colElements = {};
		for(var cc=0; cc<listTemplate.columns.length; cc++) {
			c = createTiddlyElement(r,"td");
			columnTemplate = listTemplate.columns[cc];
			var field = columnTemplate.field;
			colType = ListView.columnTypes[columnTemplate.type];
			if(colType && colType.createItem) {
				colType.createItem(c,rowObject,field,columnTemplate,cc,rc);
				if(columnTemplate.className)
					addClass(c,columnTemplate.className);
			}
			rowObject.colElements[field] = c;
		}
	}
	if(callback && listTemplate.actions)
		createTiddlyDropDown(place,ListView.getCommandHandler(callback),listTemplate.actions);
	if(callback && listTemplate.buttons) {
		for(t=0; t<listTemplate.buttons.length; t++) {
			var a = listTemplate.buttons[t];
			if(a && a.name != "")
				createTiddlyButton(place,a.caption,null,ListView.getCommandHandler(callback,a.name,a.allowEmptySelection));
		}
	}
	return table;
};

ListView.getCommandHandler = function(callback,name,allowEmptySelection)
{
	return function(e) {
		var view = findRelated(this,"TABLE",null,"previousSibling");
		var tiddlers = [];
		ListView.forEachSelector(view,function(e,rowName) {
					if(e.checked)
						tiddlers.push(rowName);
					});
		if(tiddlers.length == 0 && !allowEmptySelection) {
			alert(config.messages.nothingSelected);
		} else {
			if(this.nodeName.toLowerCase() == "select") {
				callback(view,this.value,tiddlers);
				this.selectedIndex = 0;
			} else {
				callback(view,name,tiddlers);
			}
		}
	};
};

// Invoke a callback for each selector checkbox in the listview
ListView.forEachSelector = function(view,callback)
{
	var checkboxes = view.getElementsByTagName("input");
	var hadOne = false;
	for(var t=0; t<checkboxes.length; t++) {
		var cb = checkboxes[t];
		if(cb.getAttribute("type") == "checkbox") {
			var rn = cb.getAttribute("rowName");
			if(rn) {
				callback(cb,rn);
				hadOne = true;
			}
		}
	}
	return hadOne;
};

ListView.getSelectedRows = function(view)
{
	var rowNames = [];
	ListView.forEachSelector(view,function(e,rowName) {
				if(e.checked)
					rowNames.push(rowName);
				});
	return rowNames;
};

ListView.columnTypes = {};

ListView.columnTypes.String = {
	createHeader: function(place,columnTemplate,col)
		{
			createTiddlyText(place,columnTemplate.title);
		},
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var v = listObject[field];
			if(v != undefined)
				createTiddlyText(place,v);
		}
};

ListView.columnTypes.WikiText = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var v = listObject[field];
			if(v != undefined)
				wikify(v,place,null,null);
		}
};

ListView.columnTypes.Tiddler = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var v = listObject[field];
			if(v != undefined && v.title)
				createTiddlyPopup(place,v.title,config.messages.listView.tiddlerTooltip,v);
		}
};

ListView.columnTypes.Size = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var v = listObject[field];
			if(v != undefined) {
				var t = 0;
				while(t<config.messages.sizeTemplates.length-1 && v<config.messages.sizeTemplates[t].unit)
					t++;
				createTiddlyText(place,config.messages.sizeTemplates[t].template.format([Math.round(v/config.messages.sizeTemplates[t].unit)]));
			}
		}
};

ListView.columnTypes.Link = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var v = listObject[field];
			var c = columnTemplate.text;
			if(v != undefined)
				createTiddlyText(createExternalLink(place,v),c || v);
		}
};

ListView.columnTypes.Date = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var v = listObject[field];
			if(v != undefined)
				createTiddlyText(place,v.formatString(columnTemplate.dateFormat));
		}
};

ListView.columnTypes.StringList = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var v = listObject[field];
			if(v != undefined) {
				for(var t=0; t<v.length; t++) {
					createTiddlyText(place,v[t]);
					createTiddlyElement(place,"br");
				}
			}
		}
};

ListView.columnTypes.Selector = {
	createHeader: function(place,columnTemplate,col)
		{
			createTiddlyCheckbox(place,null,false,this.onHeaderChange);
		},
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var e = createTiddlyCheckbox(place,null,listObject[field],null);
			e.setAttribute("rowName",listObject[columnTemplate.rowName]);
		},
	onHeaderChange: function(e)
		{
			var state = this.checked;
			var view = findRelated(this,"TABLE");
			if(!view)
				return;
			ListView.forEachSelector(view,function(e,rowName) {
								e.checked = state;
							});
		}
};

ListView.columnTypes.Tags = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var tags = listObject[field];
			createTiddlyText(place,String.encodeTiddlyLinkList(tags));
		}
};

ListView.columnTypes.Boolean = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			if(listObject[field] == true)
				createTiddlyText(place,columnTemplate.trueText);
			if(listObject[field] == false)
				createTiddlyText(place,columnTemplate.falseText);
		}
};

ListView.columnTypes.TagCheckbox = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var e = createTiddlyCheckbox(place,null,listObject[field],this.onChange);
			e.setAttribute("tiddler",listObject.title);
			e.setAttribute("tag",columnTemplate.tag);
		},
	onChange : function(e)
		{
			var tag = this.getAttribute("tag");
			var tiddler = this.getAttribute("tiddler");
			store.setTiddlerTag(tiddler,this.checked,tag);
		}
};

ListView.columnTypes.TiddlerLink = {
	createHeader: ListView.columnTypes.String.createHeader,
	createItem: function(place,listObject,field,columnTemplate,col,row)
		{
			var v = listObject[field];
			if(v != undefined) {
				var link = createTiddlyLink(place,listObject[columnTemplate.tiddlerLink],false,null);
				createTiddlyText(link,listObject[field]);
			}
		}
};

//--
//-- Augmented methods for the JavaScript Number(), Array(), String() and Date() objects
//--

// Clamp a number to a range
Number.prototype.clamp = function(min,max)
{
	var c = this;
	if(c < min)
		c = min;
	if(c > max)
		c = max;
	return c;
};

// Add indexOf function if browser does not support it
if(!Array.indexOf) {
Array.prototype.indexOf = function(item,from)
{
	if(!from)
		from = 0;
	for(var i=from; i<this.length; i++) {
		if(this[i] === item)
			return i;
	}
	return -1;
};}

// Find an entry in a given field of the members of an array
Array.prototype.findByField = function(field,value)
{
	for(var t=0; t<this.length; t++) {
		if(this[t][field] == value)
			return t;
	}
	return null;
};

// Return whether an entry exists in an array
Array.prototype.contains = function(item)
{
	return this.indexOf(item) != -1;
};

// Adds, removes or toggles a particular value within an array
//  value - value to add
//  mode - +1 to add value, -1 to remove value, 0 to toggle it
Array.prototype.setItem = function(value,mode)
{
	var p = this.indexOf(value);
	if(mode == 0)
		mode = (p == -1) ? +1 : -1;
	if(mode == +1) {
		if(p == -1)
			this.push(value);
	} else if(mode == -1) {
		if(p != -1)
			this.splice(p,1);
	}
};

// Return whether one of a list of values exists in an array
Array.prototype.containsAny = function(items)
{
	for(var i=0; i<items.length; i++) {
		if(this.indexOf(items[i]) != -1)
			return true;
	}
	return false;
};

// Return whether all of a list of values exists in an array
Array.prototype.containsAll = function(items)
{
	for(var i = 0; i<items.length; i++) {
		if(this.indexOf(items[i]) == -1)
			return false;
	}
	return true;
};

// Push a new value into an array only if it is not already present in the array. If the optional unique parameter is false, it reverts to a normal push
Array.prototype.pushUnique = function(item,unique)
{
	if(unique === false) {
		this.push(item);
	} else {
		if(this.indexOf(item) == -1)
			this.push(item);
	}
};

Array.prototype.remove = function(item)
{
	var p = this.indexOf(item);
	if(p != -1)
		this.splice(p,1);
};

if(!Array.prototype.map) {
Array.prototype.map = function(fn,thisObj)
{
	var scope = thisObj || window;
	var a = [];
	for(var i=0, j=this.length; i < j; ++i) {
		a.push(fn.call(scope,this[i],i,this));
	}
	return a;
};}

// Get characters from the right end of a string
String.prototype.right = function(n)
{
	return n < this.length ? this.slice(this.length-n) : this;
};

// Trim whitespace from both ends of a string
String.prototype.trim = function()
{
	return this.replace(/^\s*|\s*$/g,"");
};

// Convert a string from a CSS style property name to a JavaScript style name ("background-color" -> "backgroundColor")
String.prototype.unDash = function()
{
	var s = this.split("-");
	if(s.length > 1) {
		for(var t=1; t<s.length; t++)
			s[t] = s[t].substr(0,1).toUpperCase() + s[t].substr(1);
	}
	return s.join("");
};

// Substitute substrings from an array into a format string that includes '%1'-type specifiers
String.prototype.format = function(substrings)
{
	var subRegExp = /(?:%(\d+))/mg;
	var currPos = 0;
	var r = [];
	do {
		var match = subRegExp.exec(this);
		if(match && match[1]) {
			if(match.index > currPos)
				r.push(this.substring(currPos,match.index));
			r.push(substrings[parseInt(match[1])]);
			currPos = subRegExp.lastIndex;
		}
	} while(match);
	if(currPos < this.length)
		r.push(this.substring(currPos,this.length));
	return r.join("");
};

// Escape any special RegExp characters with that character preceded by a backslash
String.prototype.escapeRegExp = function()
{
	var s = "\\^$*+?()=!|,{}[].";
	var c = this;
	for(var t=0; t<s.length; t++)
		c = c.replace(new RegExp("\\" + s.substr(t,1),"g"),"\\" + s.substr(t,1));
	return c;
};

// Convert "\" to "\s", newlines to "\n" (and remove carriage returns)
String.prototype.escapeLineBreaks = function()
{
	return this.replace(/\\/mg,"\\s").replace(/\n/mg,"\\n").replace(/\r/mg,"");
};

// Convert "\n" to newlines, "\b" to " ", "\s" to "\" (and remove carriage returns)
String.prototype.unescapeLineBreaks = function()
{
	return this.replace(/\\n/mg,"\n").replace(/\\b/mg," ").replace(/\\s/mg,"\\").replace(/\r/mg,"");
};

// Convert & to "&amp;", < to "&lt;", > to "&gt;" and " to "&quot;"
String.prototype.htmlEncode = function()
{
	return this.replace(/&/mg,"&amp;").replace(/</mg,"&lt;").replace(/>/mg,"&gt;").replace(/\"/mg,"&quot;");
};

// Convert "&amp;" to &, "&lt;" to <, "&gt;" to > and "&quot;" to "
String.prototype.htmlDecode = function()
{
	return this.replace(/&lt;/mg,"<").replace(/&gt;/mg,">").replace(/&quot;/mg,"\"").replace(/&amp;/mg,"&");
};

// Convert a string to it's JSON representation by encoding control characters, double quotes and backslash. See json.org
String.prototype.toJSONString = function()
{
	var m = {
		'\b': '\\b',
		'\f': '\\f',
		'\n': '\\n',
		'\r': '\\r',
		'\t': '\\t',
		'"' : '\\"',
		'\\': '\\\\'
		};
	var replaceFn = function(a,b) {
		var c = m[b];
		if(c)
			return c;
		c = b.charCodeAt();
		return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
		};
	if(/["\\\x00-\x1f]/.test(this))
		return '"' + this.replace(/([\x00-\x1f\\"])/g,replaceFn) + '"';
	return '"' + this + '"';
};

// Parse a space-separated string of name:value parameters
// The result is an array of objects:
//   result[0] = object with a member for each parameter name, value of that member being an array of values
//   result[1..n] = one object for each parameter, with 'name' and 'value' members
String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults)
{
	var parseToken = function(match,p) {
		var n;
		if(match[p]) // Double quoted
			n = match[p];
		else if(match[p+1]) // Single quoted
			n = match[p+1];
		else if(match[p+2]) // Double-square-bracket quoted
			n = match[p+2];
		else if(match[p+3]) // Double-brace quoted
			try {
				n = match[p+3];
				if(allowEval)
					n = window.eval(n);
			} catch(ex) {
				throw "Unable to evaluate {{" + match[p+3] + "}}: " + exceptionText(ex);
			}
		else if(match[p+4]) // Unquoted
			n = match[p+4];
		else if(match[p+5]) // empty quote
			n = "";
		return n;
	};
	var r = [{}];
	var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")";
	var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')";
	var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])";
	var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})";
	var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)";
	var emptyQuote = "((?:\"\")|(?:''))";
	var skipSpace = "(?:\\s*)";
	var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")";
	var re = noNames ? new RegExp(token,"mg") : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg");
	var params = [];
	do {
		var match = re.exec(this);
		if(match) {
			var n = parseToken(match,1);
			if(noNames) {
				r.push({name:"",value:n});
			} else {
				var v = parseToken(match,8);
				if(v == null && defaultName) {
					v = n;
					n = defaultName;
				} else if(v == null && defaultValue) {
					v = defaultValue;
				}
				r.push({name:n,value:v});
				if(cascadeDefaults) {
					defaultName = n;
					defaultValue = v;
				}
			}
		}
	} while(match);
	// Summarise parameters into first element
	for(var t=1; t<r.length; t++) {
		if(r[0][r[t].name])
			r[0][r[t].name].push(r[t].value);
		else
			r[0][r[t].name] = [r[t].value];
	}
	return r;
};

// Process a string list of macro parameters into an array. Parameters can be quoted with "", '',
// [[]], {{ }} or left unquoted (and therefore space-separated). Double-braces {{}} results in
// an *evaluated* parameter: e.g. {{config.options.txtUserName}} results in the current user's name.
String.prototype.readMacroParams = function()
{
	var p = this.parseParams("list",null,true,true);
	var n = [];
	for(var t=1; t<p.length; t++)
		n.push(p[t].value);
	return n;
};

// Process a string list of unique tiddler names into an array. Tiddler names that have spaces in them must be [[bracketed]]
String.prototype.readBracketedList = function(unique)
{
	var p = this.parseParams("list",null,false,true);
	var n = [];
	for(var t=1; t<p.length; t++) {
		if(p[t].value)
			n.pushUnique(p[t].value,unique);
	}
	return n;
};

// Returns array with start and end index of chunk between given start and end marker, or undefined.
String.prototype.getChunkRange = function(start,end)
{
	var s = this.indexOf(start);
	if(s != -1) {
		s += start.length;
		var e = this.indexOf(end,s);
		if(e != -1)
			return [s,e];
	}
};

// Replace a chunk of a string given start and end markers
String.prototype.replaceChunk = function(start,end,sub)
{
	var r = this.getChunkRange(start,end);
	return r ? this.substring(0,r[0]) + sub + this.substring(r[1]) : this;
};

// Returns a chunk of a string between start and end markers, or undefined
String.prototype.getChunk = function(start,end)
{
	var r = this.getChunkRange(start,end);
	if(r)
		return this.substring(r[0],r[1]);
};


// Static method to bracket a string with double square brackets if it contains a space
String.encodeTiddlyLink = function(title)
{
	return title.indexOf(" ") == -1 ? title : "[[" + title + "]]";
};

// Static method to encodeTiddlyLink for every item in an array and join them with spaces
String.encodeTiddlyLinkList = function(list)
{
	if(list) {
		var results = [];
		for(var t=0; t<list.length; t++)
			results.push(String.encodeTiddlyLink(list[t]));
		return results.join(" ");
	} else {
		return "";
	}
};

// Convert a string as a sequence of name:"value" pairs into a hashmap
String.prototype.decodeHashMap = function()
{
	var fields = this.parseParams("anon","",false);
	var r = {};
	for(var t=1; t<fields.length; t++)
		r[fields[t].name] = fields[t].value;
	return r;
};

// Static method to encode a hashmap into a name:"value"... string
String.encodeHashMap = function(hashmap)
{
	var r = [];
	for(var t in hashmap)
		r.push(t + ':"' + hashmap[t] + '"');
	return r.join(" ");
};

// Static method to left-pad a string with 0s to a certain width
String.zeroPad = function(n,d)
{
	var s = n.toString();
	if(s.length < d)
		s = "000000000000000000000000000".substr(0,d-s.length) + s;
	return s;
};

String.prototype.startsWith = function(prefix)
{
	return !prefix || this.substring(0,prefix.length) == prefix;
};

// Returns the first value of the given named parameter.
function getParam(params,name,defaultValue)
{
	if(!params)
		return defaultValue;
	var p = params[0][name];
	return p ? p[0] : defaultValue;
}

// Returns the first value of the given boolean named parameter.
function getFlag(params,name,defaultValue)
{
	return !!getParam(params,name,defaultValue);
}

// Substitute date components into a string
Date.prototype.formatString = function(template)
{
	var t = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2));
	t = t.replace(/hh12/g,this.getHours12());
	t = t.replace(/0hh/g,String.zeroPad(this.getHours(),2));
	t = t.replace(/hh/g,this.getHours());
	t = t.replace(/mmm/g,config.messages.dates.shortMonths[this.getMonth()]);
	t = t.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));
	t = t.replace(/mm/g,this.getMinutes());
	t = t.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));
	t = t.replace(/ss/g,this.getSeconds());
	t = t.replace(/[ap]m/g,this.getAmPm().toLowerCase());
	t = t.replace(/[AP]M/g,this.getAmPm().toUpperCase());
	t = t.replace(/wYYYY/g,this.getYearForWeekNo());
	t = t.replace(/wYY/g,String.zeroPad(this.getYearForWeekNo()-2000,2));
	t = t.replace(/YYYY/g,this.getFullYear());
	t = t.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));
	t = t.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);
	t = t.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));
	t = t.replace(/MM/g,this.getMonth()+1);
	t = t.replace(/0WW/g,String.zeroPad(this.getWeek(),2));
	t = t.replace(/WW/g,this.getWeek());
	t = t.replace(/DDD/g,config.messages.dates.days[this.getDay()]);
	t = t.replace(/ddd/g,config.messages.dates.shortDays[this.getDay()]);
	t = t.replace(/0DD/g,String.zeroPad(this.getDate(),2));
	t = t.replace(/DDth/g,this.getDate()+this.daySuffix());
	t = t.replace(/DD/g,this.getDate());
	var tz = this.getTimezoneOffset();
	var atz = Math.abs(tz);
	t = t.replace(/TZD/g,(tz < 0 ? '+' : '-') + String.zeroPad(Math.floor(atz / 60),2) + ':' + String.zeroPad(atz % 60,2));
	t = t.replace(/\\/g,"");
	return t;
};

Date.prototype.getWeek = function()
{
	var dt = new Date(this.getTime());
	var d = dt.getDay();
	if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
	dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week to calculate weekNo
	var n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1)+3600000)/86400000);
	return Math.floor(n/7)+1;
};

Date.prototype.getYearForWeekNo = function()
{
	var dt = new Date(this.getTime());
	var d = dt.getDay();
	if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
	dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week
	return dt.getFullYear();
};

Date.prototype.getHours12 = function()
{
	var h = this.getHours();
	return h > 12 ? h-12 : ( h > 0 ? h : 12 );
};

Date.prototype.getAmPm = function()
{
	return this.getHours() >= 12 ? config.messages.dates.pm : config.messages.dates.am;
};

Date.prototype.daySuffix = function()
{
	return config.messages.dates.daySuffixes[this.getDate()-1];
};

// Convert a date to local YYYYMMDDHHMM string format
Date.prototype.convertToLocalYYYYMMDDHHMM = function()
{
	return this.getFullYear() + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2);
};

// Convert a date to UTC YYYYMMDDHHMM string format
Date.prototype.convertToYYYYMMDDHHMM = function()
{
	return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2);
};

// Convert a date to UTC YYYYMMDD.HHMMSSMMM string format
Date.prototype.convertToYYYYMMDDHHMMSSMMM = function()
{
	return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + "." + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2) + String.zeroPad(this.getUTCSeconds(),2) + String.zeroPad(this.getUTCMilliseconds(),4);
};

// Static method to create a date from a UTC YYYYMMDDHHMM format string
Date.convertFromYYYYMMDDHHMM = function(d)
{
	var hh = d.substr(8,2) || "00";
	var mm = d.substr(10,2) || "00";
	return new Date(Date.UTC(parseInt(d.substr(0,4),10),
			parseInt(d.substr(4,2),10)-1,
			parseInt(d.substr(6,2),10),
			parseInt(hh,10),
			parseInt(mm,10),0,0));
};

//--
//-- Crypto functions and associated conversion routines
//--

// Crypto 'namespace'
function Crypto() {}

// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
	var be=[];
	var len=Math.floor(str.length/4);
	var i, j;
	for(i=0, j=0; i<len; i++, j+=4) {
		be[i]=((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
	}
	while(j<str.length) {
		be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
		j++;
	}
	return be;
};

// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
	var str='';
	for(var i=0;i<be.length*32;i+=8) {
		str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
	}
	return str;
};

// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
	var hex='0123456789ABCDEF';
	var str='';
	for(var i=0;i<be.length*4;i++) {
		str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
	}
	return str;
};

// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
	return Crypto.be32sToHex(Crypto.sha1Str(str));
};

// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
	return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};

// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
	// Add 32-bit integers, wrapping at 32 bits
	function add32(a,b)
	{
		var lsw=(a&0xFFFF)+(b&0xFFFF);
		var msw=(a>>16)+(b>>16)+(lsw>>16);
		return (msw<<16)|(lsw&0xFFFF);
	}
	function AA(a,b,c,d,e)
	{
		b=(b>>>27)|(b<<5);
		var lsw=(a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
		var msw=(a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
		return (msw<<16)|(lsw&0xFFFF);
	}
	function RR(w,j)
	{
		var n=w[j-3]^w[j-8]^w[j-14]^w[j-16];
		return (n>>>31)|(n<<1);
	}

	var len=blen*8;
	x[len>>5] |= 0x80 << (24-len%32);
	x[((len+64>>9)<<4)+15]=len;
	var w=new Array(80);

	var k1=0x5A827999;
	var k2=0x6ED9EBA1;
	var k3=0x8F1BBCDC;
	var k4=0xCA62C1D6;

	var h0=0x67452301;
	var h1=0xEFCDAB89;
	var h2=0x98BADCFE;
	var h3=0x10325476;
	var h4=0xC3D2E1F0;

	for(var i=0;i<x.length;i+=16) {
		var j=0;
		var t;
		var a=h0;
		var b=h1;
		var c=h2;
		var d=h3;
		var e=h4;
		while(j<16) {
			w[j]=x[i+j];
			t=AA(e,a,d^(b&(c^d)),w[j],k1);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
		}
		while(j<20) {
			w[j]=RR(w,j);
			t=AA(e,a,d^(b&(c^d)),w[j],k1);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
		}
		while(j<40) {
			w[j]=RR(w,j);
			t=AA(e,a,b^c^d,w[j],k2);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
		}
		while(j<60) {
			w[j]=RR(w,j);
			t=AA(e,a,(b&c)|(d&(b|c)),w[j],k3);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
		}
		while(j<80) {
			w[j]=RR(w,j);
			t=AA(e,a,b^c^d,w[j],k4);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
		}
		h0=add32(h0,a);
		h1=add32(h1,b);
		h2=add32(h2,c);
		h3=add32(h3,d);
		h4=add32(h4,e);
	}
	return [h0,h1,h2,h3,h4];
};

//--
//-- RGB colour object
//--

// Construct an RGB colour object from a '#rrggbb', '#rgb' or 'rgb(n,n,n)' string or from separate r,g,b values
function RGB(r,g,b)
{
	this.r = 0;
	this.g = 0;
	this.b = 0;
	if(typeof r == "string") {
		if(r.substr(0,1) == "#") {
			if(r.length == 7) {
				this.r = parseInt(r.substr(1,2),16)/255;
				this.g = parseInt(r.substr(3,2),16)/255;
				this.b = parseInt(r.substr(5,2),16)/255;
			} else {
				this.r = parseInt(r.substr(1,1),16)/15;
				this.g = parseInt(r.substr(2,1),16)/15;
				this.b = parseInt(r.substr(3,1),16)/15;
			}
		} else {
			var rgbPattern = /rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/;
			var c = r.match(rgbPattern);
			if(c) {
				this.r = parseInt(c[1],10)/255;
				this.g = parseInt(c[2],10)/255;
				this.b = parseInt(c[3],10)/255;
			}
		}
	} else {
		this.r = r;
		this.g = g;
		this.b = b;
	}
	return this;
}

// Mixes this colour with another in a specified proportion
// c = other colour to mix
// f = 0..1 where 0 is this colour and 1 is the new colour
// Returns an RGB object
RGB.prototype.mix = function(c,f)
{
	return new RGB(this.r + (c.r-this.r) * f,this.g + (c.g-this.g) * f,this.b + (c.b-this.b) * f);
};

// Return an rgb colour as a #rrggbb format hex string
RGB.prototype.toString = function()
{
	return "#" + ("0" + Math.floor(this.r.clamp(0,1) * 255).toString(16)).right(2) +
				 ("0" + Math.floor(this.g.clamp(0,1) * 255).toString(16)).right(2) +
				 ("0" + Math.floor(this.b.clamp(0,1) * 255).toString(16)).right(2);
};

//--
//-- DOM utilities - many derived from www.quirksmode.org
//--

function drawGradient(place,horiz,locolors,hicolors)
{
	if(!hicolors)
		hicolors = locolors;
	for(var t=0; t<= 100; t+=2) {
		var bar = document.createElement("div");
		place.appendChild(bar);
		bar.style.position = "absolute";
		bar.style.left = horiz ? t + "%" : 0;
		bar.style.top = horiz ? 0 : t + "%";
		bar.style.width = horiz ? (101-t) + "%" : "100%";
		bar.style.height = horiz ? "100%" : (101-t) + "%";
		bar.style.zIndex = -1;
		var p = t/100*(locolors.length-1);
		var hc = hicolors[Math.floor(p)];
		if(typeof hc == "string")
			hc = new RGB(hc);
		var lc = locolors[Math.ceil(p)];
		if(typeof lc == "string")
			lc = new RGB(lc);
		bar.style.backgroundColor = hc.mix(lc,p-Math.floor(p)).toString();
	}
}

function createTiddlyText(parent,text)
{
	return parent.appendChild(document.createTextNode(text));
}

function createTiddlyCheckbox(parent,caption,checked,onChange)
{
	var cb = document.createElement("input");
	cb.setAttribute("type","checkbox");
	cb.onclick = onChange;
	parent.appendChild(cb);
	cb.checked = checked;
	cb.className = "chkOptionInput";
	if(caption)
		wikify(caption,parent);
	return cb;
}

function createTiddlyElement(parent,element,id,className,text,attribs)
{
	var e = document.createElement(element);
	if(className != null)
		e.className = className;
	if(id != null)
		e.setAttribute("id",id);
	if(text != null)
		e.appendChild(document.createTextNode(text));
	if(attribs) {
		for(var n in attribs) {
			e.setAttribute(n,attribs[n]);
		}
	}
	if(parent != null)
		parent.appendChild(e);
	return e;
}

function addEvent(obj,type,fn)
{
	if(obj.attachEvent) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){obj['e'+type+fn](window.event);};
		obj.attachEvent('on'+type,obj[type+fn]);
	} else {
		obj.addEventListener(type,fn,false);
	}
}

function removeEvent(obj,type,fn)
{
	if(obj.detachEvent) {
		obj.detachEvent('on'+type,obj[type+fn]);
		obj[type+fn] = null;
	} else {
		obj.removeEventListener(type,fn,false);
	}
}

function addClass(e,className)
{
	var currClass = e.className.split(" ");
	if(currClass.indexOf(className) == -1)
		e.className += " " + className;
}

function removeClass(e,className)
{
	var currClass = e.className.split(" ");
	var i = currClass.indexOf(className);
	while(i != -1) {
		currClass.splice(i,1);
		i = currClass.indexOf(className);
	}
	e.className = currClass.join(" ");
}

function hasClass(e,className)
{
	if(e.className && e.className.split(" ").indexOf(className) != -1) {
		return true;
	}
	return false;
}

// Find the closest relative with a given property value (property defaults to tagName, relative defaults to parentNode)
function findRelated(e,value,name,relative)
{
	name = name || "tagName";
	relative = relative || "parentNode";
	if(name == "className") {
		while(e && !hasClass(e,value)) {
			e = e[relative];
		}
	} else {
		while(e && e[name] != value) {
			e = e[relative];
		}
	}
	return e;
}

// Resolve the target object of an event
function resolveTarget(e)
{
	var obj;
	if(e.target)
		obj = e.target;
	else if(e.srcElement)
		obj = e.srcElement;
	if(obj.nodeType == 3) // defeat Safari bug
		obj = obj.parentNode;
	return obj;
}

// Prevent an event from bubbling
function stopEvent(e)
{
	var ev = e || window.event;
	ev.cancelBubble = true;
	if(ev.stopPropagation) ev.stopPropagation();
	return false;
}

// Return the content of an element as plain text with no formatting
function getPlainText(e)
{
	var text = "";
	if(e.innerText)
		text = e.innerText;
	else if(e.textContent)
		text = e.textContent;
	return text;
}

// Get the scroll position for window.scrollTo necessary to scroll a given element into view
function ensureVisible(e)
{
	var posTop = findPosY(e);
	var posBot = posTop + e.offsetHeight;
	var winTop = findScrollY();
	var winHeight = findWindowHeight();
	var winBot = winTop + winHeight;
	if(posTop < winTop) {
		return posTop;
	} else if(posBot > winBot) {
		if(e.offsetHeight < winHeight)
			return posTop - (winHeight - e.offsetHeight);
		else
			return posTop;
	} else {
		return winTop;
	}
}

// Get the current width of the display window
function findWindowWidth()
{
	return window.innerWidth || document.documentElement.clientWidth;
}

// Get the current height of the display window
function findWindowHeight()
{
	return window.innerHeight || document.documentElement.clientHeight;
}

// Get the current horizontal page scroll position
function findScrollX()
{
	return window.scrollX || document.documentElement.scrollLeft;
}

// Get the current vertical page scroll position
function findScrollY()
{
	return window.scrollY || document.documentElement.scrollTop;
}

function findPosX(obj)
{
	var curleft = 0;
	while(obj.offsetParent) {
		curleft += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	while(obj.offsetParent) {
		curtop += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return curtop;
}

// Blur a particular element
function blurElement(e)
{
	if(e && e.focus && e.blur) {
		e.focus();
		e.blur();
	}
}

// Create a non-breaking space
function insertSpacer(place)
{
	var e = document.createTextNode(String.fromCharCode(160));
	if(place)
		place.appendChild(e);
	return e;
}

// Remove all children of a node
function removeChildren(e)
{
	while(e && e.hasChildNodes())
		removeNode(e.firstChild);
}

// Remove a node and all it's children
function removeNode(e)
{
	scrubNode(e);
	e.parentNode.removeChild(e);
}

// Remove any event handlers or non-primitve custom attributes
function scrubNode(e)
{
	if(!config.browser.isIE)
		return;
	var att = e.attributes;
	if(att) {
		for(var t=0; t<att.length; t++) {
			var n = att[t].name;
			if(n !== 'style' && (typeof e[n] === 'function' || (typeof e[n] === 'object' && e[n] != null))) {
				try {
					e[n] = null;
				} catch(ex) {
				}
			}
		}
	}
	var c = e.firstChild;
	while(c) {
		scrubNode(c);
		c = c.nextSibling;
	}
}

// Add a stylesheet, replacing any previous custom stylesheet
function setStylesheet(s,id,doc)
{
	if(!id)
		id = "customStyleSheet";
	if(!doc)
		doc = document;
	var n = doc.getElementById(id);
	if(doc.createStyleSheet) {
		// Test for IE's non-standard createStyleSheet method
		if(n)
			n.parentNode.removeChild(n);
		// This failed without the &nbsp;
		doc.getElementsByTagName("head")[0].insertAdjacentHTML("beforeEnd","&nbsp;<style id='" + id + "'>" + s + "</style>");
	} else {
		if(n) {
			n.replaceChild(doc.createTextNode(s),n.firstChild);
		} else {
			n = doc.createElement("style");
			n.type = "text/css";
			n.id = id;
			n.appendChild(doc.createTextNode(s));
			doc.getElementsByTagName("head")[0].appendChild(n);
		}
	}
}

function removeStyleSheet(id)
{
	var e = document.getElementById(id);
	if(e)
		e.parentNode.removeChild(e);
}

// Force the browser to do a document reflow when needed to workaround browser bugs
function forceReflow()
{
	if(config.browser.isGecko) {
		setStylesheet("body {top:0px;margin-top:0px;}","forceReflow");
		setTimeout(function() {setStylesheet("","forceReflow");},1);
	}
}

// Replace the current selection of a textarea or text input and scroll it into view
function replaceSelection(e,text)
{
	if(e.setSelectionRange) {
		var oldpos = e.selectionStart;
		var isRange = e.selectionEnd > e.selectionStart;
		e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionEnd);
		e.setSelectionRange(isRange ? oldpos : oldpos + text.length,oldpos + text.length);
		var linecount = e.value.split('\n').length;
		var thisline = e.value.substr(0,e.selectionStart).split('\n').length-1;
		e.scrollTop = Math.floor((thisline - e.rows / 2) * e.scrollHeight / linecount);
	} else if(document.selection) {
		var range = document.selection.createRange();
		if(range.parentElement() == e) {
			var isCollapsed = range.text == "";
			range.text = text;
			if(!isCollapsed) {
				range.moveStart('character', -text.length);
				range.select();
			}
		}
	}
}

// Returns the text of the given (text) node, possibly merging subsequent text nodes
function getNodeText(e)
{
	var t = "";
	while(e && e.nodeName == "#text") {
		t += e.nodeValue;
		e = e.nextSibling;
	}
	return t;
}

// Returns true if the element e has a given ancestor element
function isDescendant(e,ancestor)
{
	while(e) {
		if(e === ancestor)
			return true;
		e = e.parentNode;
	}
	return false;
}

//--
//-- LoaderBase and SaverBase
//--

function LoaderBase() {}

LoaderBase.prototype.loadTiddler = function(store,node,tiddlers)
{
	var title = this.getTitle(store,node);
	if(safeMode && store.isShadowTiddler(title))
		return;
	if(title) {
		var tiddler = store.createTiddler(title);
		this.internalizeTiddler(store,tiddler,title,node);
		tiddlers.push(tiddler);
	}
};

LoaderBase.prototype.loadTiddlers = function(store,nodes)
{
	var tiddlers = [];
	for(var t = 0; t < nodes.length; t++) {
		try {
			this.loadTiddler(store,nodes[t],tiddlers);
		} catch(ex) {
			showException(ex,config.messages.tiddlerLoadError.format([this.getTitle(store,nodes[t])]));
		}
	}
	return tiddlers;
};

function SaverBase() {}

SaverBase.prototype.externalize = function(store)
{
	var results = [];
	var tiddlers = store.getTiddlers("title");
	for(var t = 0; t < tiddlers.length; t++) {
		if(!tiddlers[t].doNotSave())
			results.push(this.externalizeTiddler(store, tiddlers[t]));
	}
	return results.join("\n");
};

//--
//-- TW21Loader (inherits from LoaderBase)
//--

function TW21Loader() {}

TW21Loader.prototype = new LoaderBase();

TW21Loader.prototype.getTitle = function(store,node)
{
	var title = null;
	if(node.getAttribute) {
		title = node.getAttribute("title");
		if(!title)
			title = node.getAttribute("tiddler");
	}
	if(!title && node.id) {
		var lenPrefix = store.idPrefix.length;
		if(node.id.substr(0,lenPrefix) == store.idPrefix)
			title = node.id.substr(lenPrefix);
	}
	return title;
};

TW21Loader.prototype.internalizeTiddler = function(store,tiddler,title,node)
{
	var e = node.firstChild;
	var text = null;
	if(node.getAttribute("tiddler")) {
		text = getNodeText(e).unescapeLineBreaks();
	} else {
		while(e.nodeName!="PRE" && e.nodeName!="pre") {
			e = e.nextSibling;
		}
		text = e.innerHTML.replace(/\r/mg,"").htmlDecode();
	}
	var modifier = node.getAttribute("modifier");
	var c = node.getAttribute("created");
	var m = node.getAttribute("modified");
	var created = c ? Date.convertFromYYYYMMDDHHMM(c) : version.date;
	var modified = m ? Date.convertFromYYYYMMDDHHMM(m) : created;
	var tags = node.getAttribute("tags");
	var fields = {};
	var attrs = node.attributes;
	for(var i = attrs.length-1; i >= 0; i--) {
		var name = attrs[i].name;
		if(attrs[i].specified && !TiddlyWiki.isStandardField(name)) {
			fields[name] = attrs[i].value.unescapeLineBreaks();
		}
	}
	tiddler.assign(title,text,modifier,modified,tags,created,fields);
	return tiddler;
};

//--
//-- TW21Saver (inherits from SaverBase)
//--

function TW21Saver() {}

TW21Saver.prototype = new SaverBase();

TW21Saver.prototype.externalizeTiddler = function(store,tiddler)
{
	try {
		var extendedAttributes = "";
		var usePre = config.options.chkUsePreForStorage;
		store.forEachField(tiddler,
			function(tiddler,fieldName,value) {
				// don't store stuff from the temp namespace
				if(typeof value != "string")
					value = "";
				if(!fieldName.match(/^temp\./))
					extendedAttributes += ' %0="%1"'.format([fieldName,value.escapeLineBreaks().htmlEncode()]);
			},true);
		var created = tiddler.created;
		var modified = tiddler.modified;
		var attributes = tiddler.modifier ? ' modifier="' + tiddler.modifier.htmlEncode() + '"' : "";
		attributes += (usePre && created == version.date) ? "" :' created="' + created.convertToYYYYMMDDHHMM() + '"';
		attributes += (usePre && modified == created) ? "" : ' modified="' + modified.convertToYYYYMMDDHHMM() +'"';
		var tags = tiddler.getTags();
		if(!usePre || tags)
			attributes += ' tags="' + tags.htmlEncode() + '"';
		return ('<div %0="%1"%2%3>%4</'+'div>').format([
				usePre ? "title" : "tiddler",
				tiddler.title.htmlEncode(),
				attributes,
				extendedAttributes,
				usePre ? "\n<pre>" + tiddler.text.htmlEncode() + "</pre>\n" : tiddler.text.escapeLineBreaks().htmlEncode()
			]);
	} catch (ex) {
		throw exceptionText(ex,config.messages.tiddlerSaveError.format([tiddler.title]));
	}
};

//]]>
</script>
<script id="jsdeprecatedArea" type="text/javascript">
//<![CDATA[
//--
//-- Deprecated Tiddler code
//--

// @Deprecated: Use tiddlerToRssItem(tiddler,uri) instead
Tiddler.prototype.toRssItem = function(uri)
{
	return tiddlerToRssItem(this,uri);
};

// @Deprecated: Use "<item>\n" + tiddlerToRssItem(tiddler,uri)  + "\n</item>" instead
Tiddler.prototype.saveToRss = function(uri)
{
	return "<item>\n" + tiddlerToRssItem(this,uri) + "\n</item>";
};

//]]>
</script>
<script id="jqueryArea" type="text/javascript">
//<![CDATA[
//]]>
</script>
<script type="text/javascript">
//<![CDATA[
if(useJavaSaver)
	document.write("<applet style='position:absolute;left:-1px' name='TiddlySaver' code='TiddlySaver.class' archive='TiddlySaver.jar' width='1' height='1'></applet>");
//]]>
</script>
<!--POST-SCRIPT-START-->

<!--POST-SCRIPT-END-->
</body>
</html>
